为什么这个简单的Perl推/弹程序不起作用?

时间:2009-07-04 04:22:02

标签: perl

我正在阅读Llama(Learning Perl)书,并正在进行练习。对于这个练习:

  

编写一个程序,该程序在单独的行上读取字符串列表,直到输入结束,并以相反的顺序打印出列表。 [ 。 ]

好吧,我已经想出了一个更简单的方法(我记得你可以在数组上使用reverse ...到目前为止Perl真是太棒了...但是我想知道为什么这个不行

#!/usr/bin/perl

use 5.010;

chomp(@strings = <STDIN>);

foreach (@strings){
    push @revstrings, $_;
}

while($i++ <= scalar @revstrings){
    say pop @revstrings;
}

它是这样的:

  

$ ./first
  的一个
  2个
  3

   [^ d]
  3个
  2个
  $

如果我将while循环中的<=更改为<,则输出相同。

2 个答案:

答案 0 :(得分:15)

你永远不会过中...每次通过最后一次迭代,你都会得到:

  • $i++表示$i将增加1;
  • pop @revstrings表示scalar @revstrings将减少一个。

$i++超过原始@revstrings长度的一半时,他们会在中间相遇。

实际上,$i++是不必要的,因为当数组为空时scalar @revstrings将为零,所以你只需要:

while(scalar @revstrings){
    say pop @revstrings;
}

答案 1 :(得分:0)

编辑:简短回答是“因为您的循环条件错误。”更冗长的“标量@revstrings在每次迭代时被评估”。

while (<STDIN>) {
    push @lines, $_
}

while(@lines){
    print pop @lines;
}

少输入

@lines = <STDIN>;

while(@lines){
    print pop @lines;
}

较小的打字

@lines = <STDIN>;
print reverse @lines;

较小的打字

print reverse <>;

但最好的解决方案是

exec("tac");