2
#!/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;
    }
}
4

2 に答える 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 に答える