我已经开始玩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缓冲区$_
并开始打印.
您可以自己检查单线程生成的代码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
现在,很容易知道第二种情况有什么问题.外面吃了第一行文件而丢失了.