TCSH - самый компактный синтаксис для проверки, если значение в массиве / списке? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь выяснить, есть ли более компактный способ написания кода tcsh следующего формата, в идеале все еще на tcsh.Я потратил некоторое время на поиск, используя разные ключевые слова, но не смог найти ничего полезного.

По сути, фрагмент кода просто повторяет последовательность чисел, а затем, если это зацикленное значение находится в наборе чисел, присваиваяпеременная.Для простоты я сделал списки чисел, которые $ VAR сравнивает с относительно короткими, а число сравнений встречается мало, но реальная проблема - удвоение, размер - оба аспекта.

foreach VAR (`seq 1 24`)
    if ($VAR == 1 || $VAR == 2 || $VAR == 3 || $VAR == 4) then 
        set cat = small
    else if ($VAR == 5 || $VAR == 6 || $VAR == 7 || $VAR == 8) then
        set cat = medium
    else
        set cat = large
    endif
end

Полагаю, я больше думал о Python, где можно просто сказать «если х в [...]» и т. Д., А не сравнивать $ VAR с каждым числом по отдельности, какэто случай выше.Я рассмотрел следующий тип установки, но в итоге получается больше строк:

foreach VAR (`seq 1 24`)
    foreach C (1 2 3 4)
        if ($C == $VAR) then
            set cat = small
        endif
    end
    ...
end

Если предоставленный код такой же простой, как в tcsh, есть ли более лаконичный способ, скажем,Баш?Спасибо за любые советы.

1 Ответ

0 голосов
/ 15 апреля 2019

Боюсь, что в tcsh Ты не спасешь ни одной строчки:

#/bin/tcsh
foreach VAR (`seq 1 24`)
  if (${VAR} < 5) then
    set cat = "small"
  else if (${VAR} > 8) then
    set cat = "large"
  else
    set cat = "medium"
  endif
end
exit(0)

Вы также можете рассмотреть возможность передачи логики в AWK (я не знаю, поможет ли в вашем случае):

#/bin/tcsh
foreach VAR (`seq 1 24`)
  set cat = (`echo ${VAR} | awk '$0<5 {print("small"); exit;} $0>8 {print("large"); exit;} {print("medium");}'`)
end
exit (0)
...