perl – system()返回的值是否与“$?”相同?

当我在Perl中执行system()调用时,我通常会根据 perldocs检查返回代码.大部分时间$rc!= 0对我来说已经足够了.最近我帮了两个人,在apache下运行.cgi脚本时遇到了系统()调用问题.我指示他们检查$rc
my $rc = system(...);

并将它们链接到system()文档.然后我看得更近了,注意到文档并不是真的在谈论$rc,而是关于$?我感到有点尴尬,出现了以下问题:

是否有区别:

system(...);
if ($? == -1) {
    print "failed to execute: $!\n";
}
elsif ($? & 127) {
    printf "child died with signal %d,%s coredump\n",($? & 127),($? & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n",$? >> 8;
}

my $rc = system(...);
if ($rc == -1) {
    print "failed to execute: $!\n";
}
elsif ($rc & 127) {
    printf "child died with signal %d,($rc & 127),($rc & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n",$rc >> 8;
}

或者,简而言之,$rc等于$?对于system()?

我看过system,wait$?的文档,但对我来说还不是很清楚.过去15年里我使用$rc做错了吗?

解决方法

是的,system的回报值应等于$?

但是从$?不仅适用于系统调用和$?是一个全局变量,它可能被其他动作所覆盖.从perldoc -v’$?’这些包括:

$CHILD_ERROR

$?

The status returned by the last pipe close,backtick (““”) command,successful call to “wait()” or “waitpid()”,or from the “system()” operator.

保存值立即比较更安全:

my $rc = system('ls myfile.txt');
if ( $rc >> 8 != 0 ) {
   # do something because ls exited with an error
}

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...