Как обработать результат system в perl скрипте?

В перл скрипте есть вызов функции
system("/usr/sbin/ipset -A $table_name $ip");
иногда она возвращает
ipset v4.5: 194.186.2.46 is already in set autoban_31.

в это случае мне нужно выполнить

system("/usr/sbin/ipset -A $higher_table_name $ip");
  • Вопрос задан
  • 6762 просмотра
Пригласить эксперта
Ответы на вопрос 4
PooFF
@PooFF
out = `/usr/sbin/ipset -A $table_name $ip`
Ответ написан
Комментировать
PooFF
@PooFF
Парсер подвел

@out=`/usr/sbin/ipset -A $table_name $ip`
Ответ написан
В качестве возвращаемого значения system выдаёт код ошибки, сдвинутый на 8 бит влево. Если ipset в описанной ситуации возвращает какой-то специфический код, можно его вытащить и обработать. Если нет — тогда только парсить выходную строку, заменив system на бэктики, как предложил выше PooFF.
Ответ написан
Комментировать
Ilya_Drey
@Ilya_Drey
В дополнение к тому, что написал PooFF могу порекомендовать вам проверять код возврата, на случай ошибки при выполнении скрипта, которая вам не известна (не знаете что парсить в выводе)…

Пример:

my $command = "/usr/sbin/ipset -A $table_name $ip";
my @result =`$command`

foreach my $line (@result)
{   
  if ($line =~ /already\sin\sset\sautoban_31/) {
    system("/usr/sbin/ipset -A $higher_table_name $ip");
  }

  die("Unknown error. Command  ".$command." return code: ".$?."") if $? -ne 0 ;
}

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы