我正在阅读Llama(
Learning Perl)的书,并正在进行练习.对于这个练习:
@H_301_30@解决方法
Write a program that reads a list of strings on separate lines until end-of-input and prints out the list in reverse order. [. . .]
好吧,我已经想出了一个更简单的方法(我记得你可以在数组上使用反向… Perl是如此……真棒到目前为止),但我想知道为什么这个不起作用.
#!/usr/bin/perl use 5.010; chomp(@strings = <STDIN>); foreach (@strings){ push @revstrings,$_; } while($i++ <= scalar @revstrings){ say pop @revstrings; }
它是这样的:
$./first
one
two
three
[^D]
three
two
$
如果我将while循环中的< =更改为<而输出是相同的.
你永远不会过半…每次通过最后一次迭代,你会得到:
> $i意味着$i将增加1;
> pop @revstrings意味着标量@revstrings将减少一个.
当$i超过原始@revstrings长度的一半时,他们会在中间相遇.
实际上,$i是不必要的,因为当数组为空时标量@revstrings将为零,所以你只需要:
while(scalar @revstrings){ say pop @revstrings; }