我试图让foreach
迭代给定数组中的所有元素,考虑到新元素可能会附加到数组的末尾。
foreach header ($list)
set temp = `~/exercises/ex4/getheaders $header`
set list = ($list `~/exercises/ex4/setdiff $temp -d $list`)
end
实际上发生的事情是 foreach 在它获得的第一个$list
上运行......即使它增长了,foreach
也没有"知道&#34 ;这一点。
我想知道如何才能做到这一点"注意"变化并继续迭代新元素......?
答案 0 :(得分:1)
可能发生的是foreach
获取列表的长度一次(第一次遇到时),并在循环的持续时间内缓存该长度。我没有检查代码,但这是理智的方式。
您可以使用foreach
循环轻松模拟while
行为,此处为循环的每次迭代检索列表的长度($#list
);因此循环将一直持续到它停止增长。
一个例子是:
set list = (I eat poop)
set original_length = $#list
set i = 1
while ( $#list >= $i )
echo "$i -> $list[$i]"
if ( $i <= $original_length ) then
set list = ( $list "NEW$i" )
endif
@ i = $i + 1
end
哪个应该给出输出:
1 -> I
2 -> eat
3 -> poop
4 -> NEW1
5 -> NEW2
6 -> NEW3
请注意,此示例假定您只想为每个原始项“增长”列表;你当然可以删除这个条件,或者改变它,我不知道你想要什么行为(只是注意不要永远循环)。