我正在运行
perl -ple '$_=length' datafile
数据文件包含以下内容:
algorithm
student government
Fiumichino
结果是打印
9
18
10
-p和-l选项有什么作用?另外,$_
是什么?
答案 0 :(得分:7)
$_
是默认输入和模式搜索变量。 -p
是一个命令行开关,它在程序周围放置一个隐式while(<>)
循环,最后有一个print语句。 -l
开关将$/
和$\
设置为“\ n”(换行符)和chomp
是您的输入,或者以外行的术语,它为您处理换行符。
钻石操作员<>
是“神奇的”,因为它会自动选择您的输入通道。如果您的脚本有参数,它会将其解释为文件名,并打开该文件并读取它。如果没有,它会检查STDIN。在您的情况下,它会打开文件“datafile”。
oneliner执行的操作是读取每行数据文件,并将$_
设置为$_
的长度(如果没有提供参数,则length
使用$_
),然后打印那个号码。
你可以解析单行,看看代码是什么样的:
$ perl -MO=Deparse -ple '$_=length' datafile
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
$_ = length $_;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK
答案 1 :(得分:3)
-p
使Perl解释器遍历其输入并运行代码(在这种情况下通过-e
提供)每行一次,而不是一次总计。在每个循环迭代的底部,它打印出行。
实际行被读入$_
变量,该变量的内容是在循环体底部打印的内容,因此通过更改循环内$_
的内容,你可以改变输出的内容。
没有参数的length
运算符计算$_
的长度。因此$_=length
在打印之前用它的长度替换该行。
-l
只是让Perl解释器从输入中删除换行符(因此它们不会在这里计算长度值)并自动将它们放回输出(否则输出会被卡在一起作为91810)