最近在用 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 遍历数组主要有如下两种形式。学习
直接遍历数组元素spa
foreach (@table) { print $_; }
使用下标遍历数组元素code
foreach (0 .. $#table) { print $table[$_]; }
对比这两种方式,你会发现我上面的代码中是将这两种方式混用了,这说明了我对 foreach 的使用还很不熟悉。xml
学习一门语言最快的方法就是使用这门语言去编写实际的代码。在解决实际问题中,根据须要掌握必要的语法。在这一过程当中可能会遇到不少由于对语法不熟悉而产生的问题,遇到这样的问题时最好停下来总结下,将使用的方法与环境研究清楚,这样对语言的掌握力也可以更进一步提高。token