2014-12-08 2 views
1

Я пытаюсь сделать foreach итерировать все элементы в данном массиве, учитывая, что к концу массива могут быть добавлены новые элементы.Добавление массива в foreach tcsh

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

Что происходит на самом деле Foreach работает на первом $list он получает ... и даже тогда, когда он растет foreach «не знает», что.

Мне было интересно, как я могу заставить его «заметить» изменения и продолжить итерации новых элементов ...?

+0

Я знаю это сэр, но это не то, что я хочу. Я хочу перебирать и новые элементы. – johni

ответ

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 

Обратите внимание, что этот пример предполагает, что вы хотите только «расти» список для каждого исходного элемента; вы могли бы, конечно, удалить это условие или изменить его, я не знаю, какое поведение вы хотите (просто будьте осторожны, чтобы не зацикливаться навсегда).

Смежные вопросы