我在跑
perl -ple '$_=length' datafile
数据文件包含以下内容:
algorithm
student government
Fiumichino
结果是它打印
9
18
10
-p 和 -l 选项有什么作用?还有,什么是$_
?
我在跑
perl -ple '$_=length' datafile
数据文件包含以下内容:
algorithm
student government
Fiumichino
结果是它打印
9
18
10
-p 和 -l 选项有什么作用?还有,什么是$_
?
$_
是默认输入和模式搜索变量。-p
是一个命令行开关,它在你的程序周围放置一个隐式while(<>)
循环,最后有一个打印语句。-l
开关将and$/
设置$\
为“\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
-p
导致 Perl 解释器循环其输入并-e
每行运行一次代码(在本例中是通过提供的),而不是总共运行一次。在每次循环迭代的底部,它会打印出该行。
实际的行被读入$_
变量,该变量的内容就是循环体底部打印的内容,所以通过改变$_
循环内部的内容,你可以改变输出的内容。
不带参数的length
运算符计算 的长度$_
。所以$_=length
在打印之前用它的长度替换行。
-l
只是导致 Perl 解释器从输入中删除换行符(因此它们不会被计算在此处的长度值中)并自动将它们放回输出中(否则输出将作为 91810 卡在一起)。