当前位置:  开发笔记 > 编程语言 > 正文

Perl在-n命令行选项标志上吃第一行

如何解决《Perl在-n命令行选项标志上吃第一行》经验,为你挑选了1个好方法。

我已经开始玩perl了,我试图弄清楚perl如果我还提供一个循环,告诉使用循环有什么问题?

看起来perl正在与相同的打开文件描述符混淆,但我没有得到的是它为什么吃第一行?

perl -ne 'while (<>) { print $_; }'

当然,在这个简单的例子中,我可以简单perl -ne '{print $_}'地得到相同的功能逻辑.

但我想知道的是,如果另一个while (<>) { }被包裹,第一行消失的双循环出了什么问题?

$ perl -ne '{print $_}' hello
hello
hello
world
world
^C

$ perl -ne 'while (<>) { print $_; }' 
hello
world
world
^C

更新:根据答案,似乎正在发生的事情是Perl正在等待STDIN输入的第一个循环.在STDIN上接收输入后,输入被分配给内部缓冲区$_,逻辑进入第二个循环,再次等待新的STDIN输入.收到新的STDIN输入后,它会使用新的STDIN输入破坏STDIN缓冲区$_并开始打印.



1> Arunesh Sing..:

您可以自己检查单线程生成的代码O=Deparse.

第一:

$ perl -MO=Deparse  -ne 'print $_;' file
LINE: while (defined($_ = )) {
    print $_;
}
-e syntax OK

第二:

$ perl -MO=Deparse -ne 'while (<>) { print $_; }' file
LINE: while (defined($_ = )) {
    while (defined($_ = )) {
        print $_;
    }
}
-e syntax OK

现在,很容易知道第二种情况有什么问题.外面吃了第一行文件而丢失了.


这不是'perl`"更聪明"的问题 - 它正在做,因为你通过设置`-n`特别要求它.
@ A.Danischewski` $ foo = 1; $ foo = 2; 打印$ foo` <---为什么不打印`1`?
@ A.Danischewski我觉得你很困惑.`-n`开关非常明智,你只是错误地使用它.`perl -ne'print $ _'`会做你期望的.如果添加更多代码,则可以更改默认行为,这就是您所做的:添加了另一个readline循环.哎呀,如果你把`perl -ne'print"NO,我不打印任何行!""它不会从输入中打印任何行.如果你把'perl -ne'die'我是一个小茶壶!''它也不会打印任何东西.你告诉perl通过添加该代码来丢弃第一行.
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有