[英]Why isn't this simple Perl push/pop program working?
我正在閱讀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
一
二
三
[^ d]
三
二
$
輸出是相同的,如果我改變<=
在while循環剛<
。
你永遠不會過中...每次通過最后一次迭代,你會得到:
$i++
意味着$i
將增加1; pop @revstrings
意味着scalar @revstrings
將減少一。 當$i++
剛超過原始@revstrings
長度的一半時,它們會在中間@revstrings
。
實際上, $i++
是不必要的,因為當數組為空時scalar @revstrings
將為零,所以你只需要:
while(scalar @revstrings){
say pop @revstrings;
}
編輯 :簡短回答是“因為你的循環條件錯誤。” 更詳細的“每次迭代評估標量@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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.