読者です 読者をやめる 読者になる 読者になる

perl -e 'local $?; exit 1'

% perl -e 'local $?; exit 1'; echo $?
0

% perl -e '$? = 2; { local $?; exit 1 }'; echo $?
2

% perl -e '$? = 2'; echo $?
0

% perl -e 'END { $? = 1 }'; echo $?
1

% perl -e 'END { local $? = 1 }'; echo $?
0

perlipc をみながら、$SIG{CHLD} のところで local $? をしていたら、上記のことを初めて知った。 具体的には、子プロセスが exit code != 0 で終了したら親もexit code != 0で終了したいと思って

$SIG{CHLD} = sub {
    local $?;
    my $pid = wait;
    exit 255 if $? != 0;
};

my $pid = fork // die;
if ($pid == 0) {
    # child
    ...
}

# parent
...

みたいなコードを書いたら、子プロセスが exit code != 0 で終了しても、親は必ず exit code = 0になってしまった。

SEE ALSO

perldoc perlvar の $?