【问题标题】:Perl command line - assume while loop aroundPerl 命令行 - 假设 while 循环
【发布时间】:2014-07-09 15:50:32
【问题描述】:

谁能解释下面两个 perl(使用 cygwin)命令的输出差异:

$ echo abc | perl -n -e 'if ($_ =~ /a/) {print 1;}'

打印:

1

$ echo abc | perl -e 'if ($_ =~ /a/) {print 1;}'

第一个打印 '1' 而第二个输出空白?

谢谢

【问题讨论】:

    标签: perl if-statement


    【解决方案1】:

    -n 开关在您的代码周围添加 while 循环,因此在您的情况下,$_ 是从标准输入填充的。在第二个示例中,没有 while 循环,因此 $_ 未定义。

    使用 Deparse 你可以让 perl 显示你的代码是如何被解析的,

    perl -MO=Deparse -n -e 'if ($_ =~ /a/) {print 1;}'
    
    LINE: while (defined($_ = <ARGV>)) {
        if ($_ =~ /a/) {
            print 1;
        }
    }
    

    perl -MO=Deparse -e 'if ($_ =~ /a/) {print 1;}'
    
    if ($_ =~ /a/) {
        print 1;
    }
    

    【讨论】:

    • 谢谢,这解释了。现在我对您使用的 perl 命令行选项 -MO=Deparse 的使用有疑问。根据 Perl --help 这个选项意味着 -[mM][-]module 在执行程序之前执行“使用/不使用模块...”。我的问题是,您如何知道此选项中的 O 和 = 字符(-MO=Deparse)。有记录吗?
    • @Rajeev 是的,-M 就是这样做的。
    • @Rajeev O 是模块名称,Deparse 是请求导入的函数。另一个选项是-MList::Util=sum,这对于List::Util 的sum 函数很重要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多