【发布时间】:2011-03-23 12:44:33
【问题描述】:
当我经常使用 $_ 时,我想更好地了解它的用法。据我了解和使用,$_ 是隐式值的全局变量。
由于似乎无论如何都设置了 $_,除了 $_ 除了可读性之外,还有理由使用命名循环变量吗?
在什么情况下 $_ 是全局变量很重要?
所以如果我使用
for (@array){
print $_;
}
甚至
print $_ for @array;
效果和
一样for my $var (@array){
print $var;
}
但它的工作原理是一样的吗?我猜它不完全是,但实际的区别是什么?
更新:
在这个例子中,$_ 的范围似乎是正确的。它不再是全球性的了吗?我正在使用 5.12.3。
#!/usr/bin/perl
use strict;
use warnings;
my @array = qw/one two three four/;
my @other_array = qw/1 2 3 4/;
for (@array){
for (@other_array){
print $_;
}
print $_;
}
正确打印 1234one1234two1234three1234four。
对于全球 $_,我预计 1234 4 1234 4 1234 4 1234 4 .. 或我错过了什么明显的东西吗?
那么 $_ 什么时候是全局的?
更新:
好的,在仔细阅读了各种答案和 perlsyn 之后,我得出了一个结论:
除了可读性之外,最好避免使用 $_,因为必须知道并考虑 $_ 的隐式本地化,否则可能会遇到意外行为。
感谢您对此事的澄清。
【问题讨论】:
-
甚至
print for @array;) -
解决您的更新:
$_仍然是一个全局变量,但在每个循环中隐式本地化。例如,请参阅stackoverflow.com/questions/2238576。 -
$ man perlsyn,寻找 Foreach 循环。 -
@mob:在每个 for/foreach 循环中隐式本地化。 不在
while (<>)循环内隐式本地化