模拟cat实用程序的PERL程序

模拟cat实用程序的PERL程序,perl,Perl,在下面提到的程序中,有人能解释一下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_fi

在下面提到的程序中,有人能解释一下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;
使用严格;
使用警告;
子打印文件{
我的$file=shift;
打开文件,$FILE;
while(我的$line=){
打印$行;
}
}
子猫{
while(my$file=shift){
打印文件$file;
}
}
cat@ARGV;

不清楚哪个while循环让您感到困惑

my$file=shift
@
中删除剩余的第一个元素(其中包含传递给sub cat的参数),并将其分配给$file。如果该值为false(如果
@
中没有更多元素,或者脚本中有一个名为
0
的文件或一个空参数),则while循环将退出

my$line=
使用readline操作符(有时
是readline,有时是glob,取决于括号中的内容)从给定的文件句柄读取一行并将其分配给$line。作为一种特殊情况,使用这种形式的while测试会添加一个隐式定义的测试,因此它被视为您所说的
while(defined(my$line=))
,因此while循环只在未定义时终止(表示文件中没有更多行或某些其他IO错误),而不是在恰好为false的行上终止(例如,文件末尾的
0
,后面没有换行符)


请注意,此脚本在模拟cat方面做得很差;如前所述,如果文件名为
0
,则脚本将失败,但它也会遇到名称中前导或尾随空格的文件或其他几种情况(例如名称以“”开头)的问题。

不清楚while循环会使您困惑

my$file=shift
@
中删除剩余的第一个元素(其中包含传递给sub cat的参数),并将其分配给$file。如果为false,则while循环退出(如果
@
中没有更多元素,或者脚本中有一个名为
0
的文件或一个空参数,则会出现这种情况)

my$line=
使用readline操作符(有时
是readline,有时是glob,取决于括号中的内容)从给定的文件句柄中读取一行并将其分配给$line。作为一种特殊情况,使用这种形式的while测试会添加一个隐式定义的测试,因此它被视为您说的
while(已定义(my$line=)
,因此while循环仅在undef(表示文件中没有更多行或其他IO错误)上终止,而不是在碰巧为false的行上终止(例如,文件末尾的
0
,后面没有新行)


请注意,此脚本在模拟cat方面做得很差;如前所述,如果文件名为
0
,它将失败,但它也会遇到名称中前导或尾随空格的文件或其他几种情况(例如名称以“”开头)的问题。

这是一种冗长的编写
while(){print;}
,不是吗?最短的cat仿真是
perl-pe1文件名…
,请检查
perlrun
。这是一种冗长的编写
的方法,而(){print;}
,不是吗?最短的cat仿真是
perl-pe1文件名…
,检查
perlrun
@mpapec:不是最佳实践,但在脚本中根本不是问题。在可重用代码中,是的,这将是一个主要问题。@mpapec:不是最佳实践,但在脚本中根本不是问题。在可重用代码中,是的,这将是一个主要问题。