#!/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;
}
}
答案 0 :(得分:2)
$?
的值表示来自另一个应用程序的错误,Perl代码已通过bacticks,system
或管道打开,或者可能通过调用wait
启动。
只要您不使用多个子进程,那么通常您是安全的,但是要确保您可以在设置$?
的调用之后立即捕获该值,如下所示
my $ret = system( 'my_command' );
my $child_error = $?;
error_message($child_error) if $ret;
答案 1 :(得分:1)
如果你对$!也感兴趣,你也应该传递它,在系统调用之后立即处理它,而不是依赖它在你的sub深度正确。只要在将参数从@ 移开之前没有代码,你应该没问题。如果你做任何可能改变$的事情!还是$?在将它们移出@ 或将它们设置为@_中的值之前,您将看到更改的值,而不是初始错误后的值。