Perl one-liner with -pl命令行选项

时间:2012-05-03 01:29:09

标签: perl command-line-arguments

我正在运行

perl -ple '$_=length' datafile

数据文件包含以下内容:

algorithm
student government
Fiumichino

结果是打印

9
18
10

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

2 个答案:

答案 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)