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