Q
行爲在Perl
5
A
回答
8
您可能不應該在迭代過程中修改列表。從perldoc perlsyn
:
如果
LIST
任何部分是一個數組,如果你splice
循環體中添加或刪除元素,例如foreach
會得到非常困惑。所以不要這樣做。
如果循環(print ("$x $y $_\n");
)時打印出來$_
,你可以看到這是怎麼回事:
10 1 1
9 2 3
8 3 5
7 4 7
在這種情況下,Perl是剛剛維持它通過增加數組的索引。由於您從頭開始刪除元素,因此索引將在第四次迭代結束時從修改數組末尾跳下,因此foreach
循環終止。
7
這是當你改變你遍歷該陣列會發生什麼很好的例證。
嘗試:
use strict: #Always!
use warnings; #Always!
my @x = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
my $n=$#x;
foreach my $i(0..$n) {
my $x = pop (@x) ;
my $y = shift (@x);
print "$x $y\n" if defined $x and defined $y;
}
或者,更好:
use strict;
use warnings;
my @x=1..10; #same thing, just written more idiomatically
while(@x)
{
my $x=pop @x; #no parentheses needed
my $y=shift @x;
print "$x $y\n";
}
注意在上面的while
循環,數組@x
正在interpreted in scalar context,因此while循環將持續到元件的數量在@x
中爲零。
3
不允許你改變了你使用的是foreach循環遍歷數組。您不希望遍歷數組元素。 foreach (@x)
顯然是錯誤的。循環10次,但你只想循環5次。
既然你從數組,你循環刪除元素,你只是想循環,直到數組爲空。爲了在循環的每一遍檢查一個條件,使用while循環。
my @x = 1..10;
while (@x) {
my $x = pop(@x) ;
my $y = shift(@x);
print("$x $y\n");
}
如果你想使用foreach循環,它應該是這樣的:
my @x = 1..10;
for ([email protected]/2) {
my $x = $x[-$_];
my $y = $x[$_-1];
print("$x $y\n");
}
相關問題
- 1. 混淆Perl數組行爲
- 2. Perl:意外的$ _行爲
- 3. 更改Perl的FindBin行爲
- 4. 執行Perl在PHP
- 5. 並行SSH在perl
- 6. 爲Perl
- 7. 如何在Perl程序中將行換行爲45個字符?
- 8. 爲什麼Perl BEGIN塊在調試器中的行爲不同?
- 9. 在命令行中執行perl而不指定UNIX中的perl
- 10. 在Perl中運行MongoDB
- 11. 在Editplus中運行Perl
- 12. 在Perl中結合多行
- 13. 執行多個+ =在Perl
- 14. perl在文件上運行
- 15. 讀換行符在Perl
- 16. 行緩衝讀取在Perl
- 17. 在Perl中刪除一行
- 18. 在運行時打印Perl?
- 19. Perl奇怪的緩衝輸出行爲
- 20. 運行Perl腳本,文件名爲arg
- 21. perl如何模擬線程行爲
- 22. perl的分裂有趣的行爲
- 23. Perl睡眠的行爲()我不明白
- 24. perl意外的拆分行爲
- 25. Perl DateTime subtract_datetime_absolute有趣的行爲
- 26. perl中'++'運算符的行爲
- 27. 將Perl的一行轉換爲PHP
- 28. 將行轉換爲使用Perl的列
- 29. Perl IO ::處理警告行爲
- 30. perl分裂奇怪的行爲
感謝nneonneo。你對發生什麼的解釋正是我需要理解的。 – verbose