#!/usr/bin/env perl
use warnings;
use strict;
my $ret = system( 'my_command' );
error_message( $? ) if $ret;
sub error_message {
my $error = shift;
if ( $error == -1 ) {
print "failed to execute: $!\n";
}
elsif ( $error & 127 ) {
printf "child died with signal %d, %s coredump\n",
( $error & 127 ), ( $error & 128 ) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $error >> 8;
}
}
質問する
63 次
2 に答える
2
の値は$?
、別のアプリケーションからのエラーを表します。これは、Perl コードがバックティック、system
パイプ オープン、または への呼び出しによって開始されたことを示しwait
ます。
$?
複数の子プロセスで作業していない限り、一般的には安全ですが、次のように、 set の呼び出しの直後に値を取得できることを確認してください
my $ret = system( 'my_command' );
my $child_error = $?;
error_message($child_error) if $ret;
于 2013-03-12T16:48:54.437 に答える
1
$! にも関心がある場合は、システム コールの直後にそれを処理し、サブシステムの奥深くで正しいことに依存するのではなく、それも渡す必要があります。@ から引数をシフトする前にコードがない限り、問題ないはずです。$! または$?それらを@から外すか、@_の値に設定する前に、最初のエラーの後の値ではなく、変更された値を見ることになります。
于 2013-03-12T16:57:10.473 に答える