我需要编辑一些 Perl 脚本,而且我对这种语言很陌生。我遇到过这样的说法:
print for (@$result);
Run Code Online (Sandbox Code Playgroud)
我知道$result是对数组的引用,而@$result返回整个数组。但是print是什么意思呢?
先感谢您。
在 Perl 中,有隐式变量这样的东西。您可能已经将其视为$_. Perl 中有很多$_默认情况下可以使用的内置函数。
$_设置在各种地方,例如循环。所以你可以这样做:
while ( <$filehandle> ) {
chomp;
tr/A-Z/a-z/;
s/oldword/newword/;
print;
}
Run Code Online (Sandbox Code Playgroud)
每行都在使用$_和修改它。您的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";
}
Run Code Online (Sandbox Code Playgroud)
分配一个变量名来捕获来自 的一行<$filehandle>,只是立即丢弃它是多余的 - 因此我们使用split默认情况下使用它$_来提取3个值。
如果很难弄清楚发生了什么,那么更有用的方法之一是使用perl -MO=Deparsewhich 将重新打印脚本的“已解析”版本。所以在你给出的例子中:
foreach $_ (@$result) {
print $_;
}
Run Code Online (Sandbox Code Playgroud)