【问题标题】:Perl one-liner with -pl command-line options带有 -pl 命令行选项的 Perl 单行程序
【发布时间】:2012-05-12 12:41:57
【问题描述】:

我在跑步

perl -ple '$_=length' datafile

数据文件包含以下内容:

algorithm
student government
Fiumichino

结果是它打印出来了

9
18
10

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

【问题讨论】:

  • 数据文件中的单词都在单独的行中
  • 查看 perlrun 和 perlvar 文档。

标签: perl command-line-arguments


【解决方案1】:

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

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

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

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

【讨论】:

  • 编辑有点困惑,@PeterMortensen;小写的“perl”已经意味着“Perl 解释器”,而不是大写的“Perl”,这意味着语言......这就是 Camel jusage。
【解决方案2】:

$_ 是默认输入和模式搜索变量。 -p 是一个命令行开关,它在你的程序周围放置一个隐式的 while(<>) 循环,最后有一个 print 语句。 -l 开关将$/$\ 设置为“\n”(换行符)和chomps 您的输入,或者用外行的话来说,它为您处理换行符。

菱形运算符<> 是“神奇的”,因为它会自动选择您的输入通道。如果您的脚本有参数,它会将其解释为文件名,然后打开该文件并读取它。如果不是,它会检查 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-06-06
    • 1970-01-01
    • 2011-08-02
    • 2014-05-28
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多