我在模块中找到了一个像这样编写的for循环
for( @array ) {
my $scalar = $_;
...
...
}
这与以下编写for循环的方式有区别吗?
for my $scalar ( @array ) {
...
...
}
答案 0 :(得分:11)
是的,在第一个示例中,for
循环充当了一个局部化器(设置$_
,它是许多Perl函数的默认参数),而不是数组中的元素。这具有掩盖$_
循环之外的值for
的副作用。 $_
具有动态范围,并且在for
循环内调用的任何函数中都可见。当您计划使用for
作为其特殊功能时,您应该主要使用此版本的$_
循环。
此外,在第一个示例中,$scalar
是数组中值的副本,而在第二个示例中,$scalar
是数组中值的别名。如果您计划在循环内设置数组的值,这很重要。或者,正如daotoad所指出的那样,当您需要使用数组元素的副本时,第一个表单非常有用,例如使用破坏性函数调用(chomp, s///, tr/// ...
)。
最后,第一个例子会慢一点。
答案 1 :(得分:3)
$_
是“默认输入和模式匹配空间”。换句话说,如果您从while循环顶部的文件句柄读入,或者运行foreach循环而不命名循环变量,则会为您设置$_
。
但是,如果你编写一个foreach循环并命名一个循环变量,则不会设置$ _。这可以通过以下代码来证明:
1. #!/usr/bin/perl -w
2. @array = (1,2,3);
3. foreach my $elmnt (@array)
4. {
5. print "$_ ";
6. }
输出为“在连接中使用未初始化的值(。)”
但是,如果您将第3行替换为:
foreach (@array)
预期输出为“1 2 3”。
现在在你的情况下,总是更好的在foreach循环中命名一个循环变量以使代码更具可读性(perl已被诅咒很多,因为它的可读性较低),这样也不需要显式赋值$_
变量以及由此产生的范围问题。
答案 2 :(得分:2)
我无法解释比doc可以
更好的解释