2013-12-06 2 views
1

Я хочу принять решение на основе результата системы - внешний результат commend. like: В моем коде я выполняю одну системную команду, и если эта команда дает ошибку, я должен сделать что-то другое. Пожалуйста, помогите мне достичь этого:принять решение из вывода внешней команды в perl-скрипте

This is just algorithm ....... i am not able to get value from result 
$result = `dt add $dest_file -c porting`; 
if($result = 'error') 
{ 
    do something 1 
} 
else 
{ 
    do something 2 
} 

пожалуйста предложить мне способ получить значение в $ результат Я думаю, в этом случае я не должен использовать систему

+0

Что вы делаете, это неправильное изменение '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'или' '' '' '' ', поскольку это сравнение строк. Кроме того, поскольку dt, вероятно, возвращает несколько строк, '' eq'' не подходит для использования '' = ~ '', что означает regex – nrathaus

+0

Если я пытаюсь напечатать результат ... я ничего не получаю если моя команда dt приводит к ошибке – user2991556

+0

Я предполагаю, что вышеприведенный комментарий не был очевиден: вместо этого используйте 'if ($ result = ~ 'error')'. – devnull

ответ

1

Мы должны знать, что команда dt есть. Я предполагаю, что это DITrack, который ведет себя красивым способом Unixish, что означает, что он возвращает ненулевой код ошибки, когда он терпит неудачу.

Когда Perl выполняет системную команду, он возвращает значение выхода (вид ...) в $?. Если dt является DiTrack, это стандартная реализация такой команды Unix и возвращает нулевой код выхода, когда он работает, и возвращает ненулевой код выхода, когда он не работает, вы можете использовать $?, чтобы определить, удалось ли это или нет. :

$result = qx(dt add $dest_file -c porting); # qx(...) preferred over back ticks. 
if ($? != 0) { 
    chomp $result; 
    say qq(Everything is okay! Program returned $result); 
} 
else { 
    die qq(Some sort of error has happened); 
} 

проблема заключается в том, что оба $? возвращает код завершения, и режим отказа. Там в этот фрагмент кода из system, который разбирает $?:

if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 
0

Вы могли бы рассмотреть возможность использования регулярных выражений:

$result = `dt add $dest_file -c porting`; 
    if($result =~ /error/) 
    { 
    do something 1 
    } 
    else 
    { 
    do something 2 
    } 

Одна вещь, чтобы держать ум в том, что обратные кавычки обычно/потенциально возвращает символ новой строки, а также поэтому вам нужно учитывать это. Использование regex позволит вам быстро обойти это.

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