通过“$?”是否安全?一个子程序?

时间:2013-03-12 16:29:48

标签: perl error-handling system

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

2 个答案:

答案 0 :(得分:2)

$?的值表示来自另一个应用程序的错误,Perl代码已通过bacticks,system或管道打开,或者可能通过调用wait启动。

只要您不使用多个子进程,那么通常您是安全的,但是要确保您可以在设置$?的调用之后立即捕获该值,如下所示

my $ret = system( 'my_command' );
my $child_error = $?;

error_message($child_error) if $ret;

答案 1 :(得分:1)

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