【发布时间】:2014-10-14 18:53:27
【问题描述】:
我需要编辑一些 Perl 脚本,而且我是这种语言的新手。 遇到如下说法:
print for (@$result);
我知道 $result 是对数组的引用,而 @$result 返回整个数组。 但是print for是什么意思呢?
提前谢谢你。
【问题讨论】:
-
另请注意,这可能只是写成
print @$result;
我需要编辑一些 Perl 脚本,而且我是这种语言的新手。 遇到如下说法:
print for (@$result);
我知道 $result 是对数组的引用,而 @$result 返回整个数组。 但是print for是什么意思呢?
提前谢谢你。
【问题讨论】:
print @$result;
在 Perl 中,有一个隐式变量。您可能已经将其视为$_。 perl 中有很多内置函数默认在$_ 上工作。
$_ 设置在多个地方,例如循环。所以你可以这样做:
while ( <$filehandle> ) {
chomp;
tr/A-Z/a-z/;
s/oldword/newword/;
print;
}
每一行都使用$_ 并随时修改它。您的 for 循环也在做同样的事情 - 循环的每次迭代都将 $_ 设置为当前值,然后默认情况下 print 会这样做。
不过,我要指出 - 虽然有用且聪明,但它也是制作令人困惑和难以理解的代码的好方法。例如,在嵌套循环中,可能很不清楚$_ 的实际情况。
所以我通常会:
避免显式编写它 - 如果您需要这样做,您应该考虑正确命名您的变量。
仅在可以更清楚地了解正在发生的事情的地方使用它。根据经验 - 如果您使用它超过两次,您应该可能改用命名变量。
如果在文件句柄上进行迭代,我发现它特别有用。例如:
while ( <$filehandle> ) {
next unless m/keyword/; #skips any line without 'keyword' in it.
my ( $wiggle, $wobble, $fronk ) = split ( /:/ ); #split $_ into 3 variables on ':'
print $wobble, "\n";
}
分配一个变量名来从<$filehandle>捕获一行是多余的,只是立即丢弃它-因此我们使用split,默认情况下使用$_来提取3个值。
如果很难弄清楚发生了什么,那么更有用的方法之一是使用perl -MO=Deparse,它将重新打印脚本的“解析”版本。所以在你给出的例子中:
foreach $_ (@$result) {
print $_;
}
【讨论】:
相当于for (@$result) { print; },相当于for (@$result) { print $_; }。 $_ 指的是当前元素。
【讨论】:
$row 不在范围内时(在这种情况下您应该使用my $row)。如果$row 在范围内,除非您使用my 遮蔽它,否则它将被覆盖。
for $var (...) { ... },你肯定是打算做for my $var (...) { ... }