让我们来看看每一件事:
foreach (@items) {
...
}
这个for 循环(foreach 和for 在 Perl 中是相同的命令)从@items 列表中获取每个项目,并将其设置为$_。 $_ 是 Perl 中的一个特殊变量,用作默认变量。这个想法是你可以做这样的事情:
foreach (@items) {
s/foo/bar/;
uc;
print;
}
这些命令中的每一个都将对$_ 变量进行操作!如果你只说print 没有其他内容,它将打印$_ 中的任何内容。如果您说uc 并且没有提及变量,则它将大写$_ 中的任何内容。
现在不鼓励这样做有几个原因。首先,$_ 是全局,因此可能会出现非预期的副作用。例如,假设您调用了一个带有$_ 值的子例程。你会突然惊讶于你的程序不起作用。
另一个-l 是test 运算符。该运算符检查给定的文件是否是符号链接。我已经链接到解释所有测试运算符的 Perldoc。
如果您不熟悉 Unix 或 BASH/Korn/Bourne shell 脚本,那么以破折号开头的命令看起来很奇怪。然而,Perl 的大部分语法都被盗用了……我的意思是 从 Unix shell 和 awk 命令中借来的。在 Unix 中,有一个名为 test 的命令,您可以像这样使用它:
if test -L $FILE
then
....
fi
在 Unix 中,-L 是 test 命令的参数,而在 Unix 中,命令的大多数参数都以破折号开头。 Perl 只是借用相同的语法破折号和所有。
有趣的是,如果您阅读这些测试命令的 Perldoc,您会注意到,就像 foreach 循环一样,如果您不给它一个变量或文件名,各种测试命令将使用 $_ 变量。编写该脚本的人可能会这样编写循环:
foreach (@items)
{
if (-l) ## Notice no mention of the `$_` variable
{
...
}
}
是的,这太清楚了!
仅供参考,许多 Perl 专家 (cough Damian Conway cough) 推荐的 现代 方法是避免 @尽可能使用 987654346@ 变量,因为它并不能真正增加清晰度并且可能导致问题。他还建议只说for 而忘记foreach,并在同一行使用花括号:
for my $file (@items) {
if ( -l $file ) {
...
}
}
这可能对-l 命令没有帮助,但至少您可以看到您正在处理文件,因此您可能会怀疑-l 与文件有关。
不幸的是,Perldoc 将所有这些文件测试放在 -X 部分并按字母顺序排列在 X 下,因此如果您在 Perldoc 中搜索 -l 命令或任何以破折号开头,除非您知道,否则您将找不到它。但是,至少您现在知道将来当您看到这样的内容时该去哪里:-s $file。