关于foreach值的问题

时间:2010-03-11 06:14:07

标签: perl foreach

我在模块中找到了一个像这样编写的for循环

for( @array ) {
    my $scalar = $_;
    ...
    ...
}

这与以下编写for循环的方式有区别吗?

for my $scalar ( @array ) {
    ...
    ...
}

3 个答案:

答案 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可以

更好的解释