在下面提到的程序中,有人可以解释while循环中使用的表达式
use strict;
use warnings;
sub print_file {
my $file = shift;
open FILE, $file;
while ( my $line = <FILE> ) {
print $line;
}
}
sub cat {
while ( my $file = shift ) {
print_file $file;
}
}
cat @ARGV;
答案 0 :(得分:5)
不清楚while循环让你感到困惑。
my $file = shift
从@_
中移除第一个剩余元素(其中包含传递给子cat的参数)并将其分配给$ file。如果这是假的,那么while循环退出(当@_
中没有更多元素或者你有一个名为0
的文件或脚本的空参数时,它会退出。)
my $line = <FILE>
使用readline运算符(有时候<>
是readline,有时它是glob,取决于括号中的内容)从给定的文件句柄读取一行并将其分配给$ line。作为一种特殊情况,使用这种形式的while测试会添加一个隐式定义的测试,所以它被视为你说while ( defined( my $line = <FILE> ) )
,所以while循环只在undef上终止(表示文件中没有更多的行或者一些其他IO错误),而不是恰好是错误的行(例如文件末尾的0
,后面没有换行符。)
请注意,此脚本在模拟cat方面表现不佳;如上所述,如果文件名为0
,它将失败,但是对于名称中带有前导或尾随空格的文件或其他几种情况(例如以'&lt;'或'&gt;开头的名称)也会出现问题;')