perl 中的 foreach 语句

我为何要写这个简单的问题

最近在用 perl 来编写【代码生成器】的过程当中屡次遇到对 foreach 语句使用不当的问题。对于这个问题,我在第一次遇到时以为本身在写代码时没有想太明白,再次遇到同一个问题,我以为颇有必要在这里记录一下,既为了加深对此问题的印象,也可以给其余 perl 的初学者提供参考。web

简单代码生成器的原理

我这里说起的【代码生成器】其实很是简单。它经过读入预约格式的输入,而后解析输入数据,生成各类参数信息,将这些参数信息传递到子过程当中用来生成须要的代码字符串,而后将代码写入到文件中。在这一过程当中主要使用了字符串的切割、转换、追加等操做,没有太大的难度,却须要处理许多细节问题。数组

错误使用示例

在编写代码生成器的过程当中,我常常须要使用 foreach 来遍历数组的每一项,从每一项中提取信息,制做参数传递给子函数来生成代码。下面是一个 foreach错误使用方式的示例。svg

#!/usr/bin/perl

use strict;

my (@table) = ("name", "number", "id");

sub generate_table
{
    my ($str) = @_;
    my ($buffer);

    $buffer = $str . " test\n";

    # .....

    return $buffer;
}

foreach (@table)
{
    print &generate_table($table[$_]);
}

对错误的反思

在上面的代码中,使用 foreach 遍历 table 数组看上去没有什么问题,可在 foreach 的 block 中我引用数组每一元素的语句是 $table[$_]。这里的引用是不正确的。$_ 在这里表示的就是每个元素的值。这里没有报错,运行时输出结果的第一项是正常的,后两项却不正常。若是有不少输出,不仔细去观察可能不能马上发现这个问题!函数

正确的使用方式是什么

查阅资料发如今 perl 中使用 foreach 遍历数组主要有如下两种形式。学习

  1. 直接遍历数组元素spa

    foreach (@table) {
        print $_;
    }
  2. 使用下标遍历数组元素code

foreach (0 .. $#table)
	{
	    print $table[$_];
	}

对比这两种方式,你会发现我上面的代码中是将这两种方式混用了,这说明了我对 foreach 的使用还很不熟悉。xml

总结

学习一门语言最快的方法就是使用这门语言去编写实际的代码。在解决实际问题中,根据须要掌握必要的语法。在这一过程当中可能会遇到不少由于对语法不熟悉而产生的问题,遇到这样的问题时最好停下来总结下,将使用的方法与环境研究清楚,这样对语言的掌握力也可以更进一步提高。token