【问题标题】:Perl: How to exit from main script if exit criteria is in a subscript?Perl:如果退出条件在下标中,如何退出主脚本?
【发布时间】:2022-01-27 05:12:59
【问题描述】:

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

ma​​in.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 处停止。

【问题讨论】:

  • 这不是在 Perl 中运行外部代码的好方法。

标签: perl exit-code


【解决方案1】:

sub.pl 总是在脚本结束时退出,而不仅仅是在您退出时明确退出其他地方。您可以在 sub.pl 中使用特定代码退出:

exit 1 if $value eq "b";

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

system( $cmd ) and last

【讨论】:

  • 它有效。我发现system($cmd) and exit;system($cmd) or die "Exit with die: $!\n"; 也有效。目前我更喜欢 die 方法,因为它会给我一个错误。
  • 其他 cmets:system($cmd) == 0 and die "Exit with die: $?\n!";system($cmd) or die "Exit with die: $?\n!"; 给出相同的 STDOUT:sub2.pl aExit with die: 0! at main.pl line 15.system($cmd) and die "Exit with die: $?\n!";system($cmd) == 0 or die "Exit with die: $?\n!"; 给出相同的 STDOUT: sub2.pl a sub2.pl b Exit from script 2 Exit with die: 256 ! at main.pl line 15. 为什么在前两种情况下缺少两个 STDOUT?似乎在前两种情况下,从 main 退出发生在第二个循环发生之前。这怎么可能?
【解决方案2】:

添加到@AKHolland 的答案...

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2013-08-28
  • 2014-11-13
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多