在foreach tcsh中附加到数组

时间:2014-12-08 11:00:03

标签: arrays shell foreach append tcsh

我试图让foreach迭代给定数组中的所有元素,考虑到新元素可能会附加到数组的末尾。

foreach header ($list)
   set temp = `~/exercises/ex4/getheaders $header`
   set list = ($list `~/exercises/ex4/setdiff $temp -d $list`)
end

实际上发生的事情是 foreach 在它获得的第一个$list上运行......即使它增长了,foreach也没有"知道&#34 ;这一点。

我想知道如何才能做到这一点"注意"变化并继续迭代新元素......?

1 个答案:

答案 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

请注意,此示例假定您只想为每个原始项“增长”列表;你当然可以删除这个条件,或者改变它,我不知道你想要什么行为(只是注意不要永远循环)。