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

如果你也对 $! 感兴趣,你也应该传递它,在系统调用之后立即处理它,而不是依赖它在你的 sub 深处是正确的。只要在将参数从 @ 移开之前没有代码,就可以了。如果你做任何可能改变 $! 还是美元?在将它们移出 @或将它们设置为 @_ 中的值之前,您将查看更改后的值,而不是初始错误后的值。

于 2013-03-12T16:57:10.473 回答