-5

我在跑

perl -ple '$_=length' datafile

数据文件包含以下内容:

algorithm
student government
Fiumichino

结果是它打印

9
18
10

-p 和 -l 选项有什么作用?还有,什么是$_

4

2 回答 2

7

$_是默认输入和模式搜索变量。-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
于 2012-05-03T01:34:54.997 回答
3

-p导致 Perl 解释器循环其输入并-e每行运行一次代码(在本例中是通过提供的),而不是总共运行一次。在每次循环迭代的底部,它会打印出该行。

实际的行被读入$_变量,该变量的内容就是循环体底部打印的内容,所以通过改变$_循环内部的内容,你可以改变输出的内容。

不带参数的length运算符计算 的长度$_。所以$_=length在打印之前用它的长度替换行。

-l只是导致 Perl 解释器从输入中删除换行符(因此它们不会被计算在此处的长度值中)并自动将它们放回输出中(否则输出将作为 91810 卡在一起)。

于 2012-05-03T01:43:05.643 回答