perl中foreach为什么输出不了第一行?

2024-11-06 18:22:04
推荐回答(2个)
回答1:

这是因为你foreach试图枚举@lines,而在枚举过程中pop又修改了@lines,因此foreach本身会出问题。从可能原因分析上,foreach试图从◎lines开头向结尾遍历,而遍历过程中结尾部分得元素又被你从列表中移除了,用其他编程语言得话说,迭代器iterator提早结束了。shift没有问题是因为遍历得方向和shift移除元素得方向正好相同,移除得元素恰好是已经遍历过得

你应该避免foreach和任何修改列表得函数合用,否则肯定会出错,正确得方法是使用while
while(@lines) 代替foreach(@lines)

如果用foreach,你应该用
foreach $line(reverse @lines)
{
printf "%s\n", $line;
}

回答2:

open FILE1,"fred";
print"文件fred:";
foreach(@lines) { $line = pop @lines; print"$line\n"; }

呵呵, 你根本就没有读取过 fred 这个档呢. 应该写成

open FILE1, "fred";
@lines = ;
close FILE1;
foreach(@lines) { $line = pop @lines; print"$line\n"; }
# 也可以写成
print foreach reverse @lines;

留意一下, pop() 是由尾走出来的, 所以结果会是 3,2,1 ... 的顺序
如果要顺向顺序, 你就要用 shift()