我为什么要写这个简单的问题
最近在用 perl 来编写【代码生成器】的过程中多次遇到对 foreach 语句使用不当的问题。对于这个问题,我在第一次遇到时觉得自己在写代码时没有想太明白,再次遇到同一个问题,我觉得很有必要在这里记录一下,既为了加深对此问题的印象,也能够给其他 perl 的初学者提供参考。
简单代码生成器的原理
我这里提及的【代码生成器】其实非常简单。它通过读入预定格式的输入,然后解析输入数据,生成各种参数信息,将这些参数信息传递到子过程中用来生成需要的代码字符串,然后将代码写入到文件中。在这一过程中主要使用了字符串的切割、转换、追加等操作,没有太大的难度,却需要处理许多细节问题。
错误使用示例
在编写代码生成器的过程中,我经常需要使用 foreach 来遍历数组的每一项,从每一项中提取信息,制作参数传递给子函数来生成代码。下面是一个 foreach错误使用方式的示例。
#!/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 遍历数组主要有以下两种形式。
-
直接遍历数组元素
foreach (@table) { print $_; }
-
使用下标遍历数组元素
foreach (0 .. $#table)
{
print $table[$_];
}
对比这两种方式,你会发现我上面的代码中是将这两种方式混用了,这说明了我对 foreach 的使用还很不熟悉。
总结
学习一门语言最快的方法就是使用这门语言去编写实际的代码。在解决实际问题中,根据需要掌握必要的语法。在这一过程中可能会遇到很多因为对语法不熟悉而产生的问题,遇到这样的问题时最好停下来总结下,将使用的方法与环境研究清楚,这样对语言的掌握力也能够更进一步提升。