Perl:如果退出条件在下标中,如何退出主脚本?

Perl: How to exit from main script if exit criteria is in a subscript?

我有一个脚本 main.pl,其中包含一个列表循环。此循环调用包含退出条件的下标 sub.pl。当条件满足时,程序只退出下标而不退出主脚本。我必须如何更改代码才能停止主脚本?

main.pl:

use strict; 
use warnings;
    
my @list = qw (a b c);

foreach my $i (@list) {    
    my $cmd = "sub.pl $i";
    print "$cmd\n";        
    system($cmd);        
}

sub.pl:

use strict; 
use warnings;    
use Cwd;

my $dir0 = getcwd;    
open my $LOG, ">>$dir0/log.txt" or die "Cannot open log.txt: $!\n";

my $value = $ARGV[0];

if ( $value eq 'b') {
    print "\nExit from script 2\n";
    exit;
}

print $LOG "Value is $value\n";
close $LOG;

标准输出是:

# sub.pl a
# sub.pl b
# 
# Exit from script 2
# sub.pl c
    

$LOG 输出为:

# Value is a
# Value is c

我希望脚本在值 b 处停止。

sub.pl 总是在脚本结束时退出,而不仅仅是当您在其他地方显式退出时退出。您可以使用 sub.pl:

中的特定代码退出
exit 1 if $value eq "b";

然后在main.pl中查找退出代码:

system( $cmd ) and last

添加到@AKHolland 的回答中...

不幸的是,通常不能只检查 system($cmd) 的退出代码,因为 perl 将比退出代码多得多的信息多路复用到 $? 中,这让生活变得很困难。 [1] 我建议始终使用这样的代码来检查它。

system($cmd);
last if ( ($? >> 8) & 255);

[1] https://perldoc.perl.org/functions/system