уровень ошибок в Perl - PullRequest
       7

уровень ошибок в Perl

1 голос
/ 19 ноября 2010

Мне нужно завершить сценарий perl в соответствии с кодом возврата из предыдущего шага.
что-то вроде

  IF ERRORLEVEL 1 goto ERROR  

в пакетной обработке.
у меня есть

$PROG = `spu_comp 2>&1 $a 1 1`;  

Мне нужно, если на этом шаге выдается ошибка, программа должна завершиться.
Заранее спасибо за ваш ввод.

Ответы [ 5 ]

4 голосов
/ 19 ноября 2010

Сразу после строки, которой вы назначаете $PROG, добавьте эту строку:

($? >> 8) and die "spu_comp exited with non-zero return value";
1 голос
/ 19 ноября 2010
$ perl -le'`sh -c "exit 0"`;($?>>8) and die "exited with non-zero: ", ($?>>8)'
$ perl -le'`sh -c "exit 1"`;($?>>8) and die "exited with non-zero: ", ($?>>8)'
exited with non-zero: 1 at -e line 1.
0 голосов
/ 17 сентября 2015

В дополнение к ответу @ husker, стоит отметить, что $? работает только для кодов 255 или менее.Windows коды ошибок обычно превышают это.Однако модуль IPC :: System :: Simple предоставляет методы типа capture(), которые могут корректно извлекать коды> 255.

например,

use Test::More;
use IPC::System::Simple qw(capture $EXITVAL EXIT_ANY);
my $modeTest = capture(EXIT_ANY, "some command that sets error code 5020");
is( $EXITVAL , 5020, "Expect error code 5020" );
0 голосов
/ 23 января 2012

Вы можете получить правильный код возврата из $ PROG, добавив следующую строку.

my $ret = $?/256   #/

или чище

my $ret = $? >> 8;

Затем сравните $ ret с возможными значениями, которые вы можете получить

if ($ret == 0)
{
   # Do something if finished successfully
}
elsif($ret == 1)
{
   error();
}
else
{
   # Return something else that was nor 0 nor 1
}
0 голосов
/ 13 декабря 2010

Похоже, что ERRORLEVEL не является истинным кодом выхода для perl.

У меня та же проблема.Файл bat

@Echo OFF
echo setting error level 1
EXIT /B 1

С файлом perl

#!/usr/bin/perl
$command = `C:\foo.bat`;
print "Error Level: " .$? ."\n";
print "Command: " . $command . "\n";

Выходные данные

Error Level: 0
Command:

Файл perl

#!/usr/bin/perl

my $command = `dir`;#try both dir and dri to test real exit codes against batch exit codes
print "Error Level: " .$? ."\n";
print "Command: " . $command . "\n";

даст

C:\>back.pl
'dri' is not recognized as an internal or external command,
operable program or batch file.
Error Level: 256
Command:

C:\>back.pl
Error Level: 0
Command:  Volume in drive C has no label.
 Volume Serial Number is 8068-BE74

 Directory of C:\

12/13/2010  11:02 AM                 7 8
06/02/2010  01:13 PM                 0 AUTOEXEC.BAT
06/04/2010  01:00 PM    <DIR>          AutoSGN
12/13/2010  12:03 PM               111 back.pl
06/02/2010  01:13 PM                 0 CONFIG.SYS
06/03/2010  07:37 PM    <DIR>          Documents and Settings
12/13/2010  12:01 PM                46 foo.bat
06/04/2010  03:17 PM    <DIR>          HorizonTemp
06/02/2010  02:41 PM    <DIR>          Intel
06/04/2010  02:19 PM    <DIR>          league
06/04/2010  12:31 PM    <DIR>          Perl
12/10/2010  03:28 PM    <DIR>          Program Files
12/08/2010  04:13 PM    <DIR>          Quarantine
12/13/2010  08:14 AM    <DIR>          WINDOWS
               5 File(s)            164 bytes
               9 Dir(s)  18,949,783,552 bytes free


C:\>
...