【发布时间】:2015-12-07 13:40:43
【问题描述】:
我已经开始使用 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 缓冲区$_ 并开始打印。
【问题讨论】:
-
如果您不想跳过第一行,您应该在第二个 while 循环之前 print()。
perl -ne 'print; while (<>) { print }' -
@Сухой27 谢谢这是解决问题的方法,但我试图弄清楚为什么有必要这样做。通过打开第二个调用,行缓冲区被吃掉了。为什么没有为 STDIN 文件描述符输出缓冲的所有数据?我尝试了
select 0; $|=1; select 1; $|=1之类的东西,但结果是一样的。 -
'{print $_}'不正确。它应该只是print $_(或者甚至只是print)。花括号{ }在 Perl 中创建一个哈希引用。这不像在awk中。另外,如果你想打印这些行,你应该改用-p,就像-n,除了它也会打印。
标签: perl