perl系统调用不会随机执行
在perl脚本的循环结构中,我编写了以下代码行以使用系统工具解析文本文件,在进程中生成临时文本文件,然后将临时输出读取到数组中以便在perl脚本中进行处理:
system("awk '(NR+2)%4==0' $infile[$i+$j] | tre-agrep -ns -E $dist[$a][$b] -k $query[$a][$b] | awk 'BEGIN{FS=":";OFS=":"}{print $1,$2}' > $outfile");
open(my $FH, "<", $outfile) || die "Can't open $outfile: $!";
while(<$FH>) {
...
}
close($FH);
这些命令几乎是逐字地重复执行两次(修改了一些参数,但回收了文件句柄),这个循环结构本身被迭代了很多次。 出乎意料的是,这个程序有时无法完成系统调用,导致依赖于系统调用生成的输出的后续行依次失败,从而触发脚本的中止并显示相当无用的错误消息“没有这样的文件或目录“(参考open
声明)。 直接从控制台执行相同的系统调用而不是在perl脚本的上下文中显示该命令会生成预期的输出。 我将这种行为称为任意行为,因为有时我的脚本会在open
线路失败之前不同地完成1至3次迭代,并且变化成功的基础还不清楚。 当脚本工作正常时,系统调用需要一段时间(大约2分钟),而当脚本失败时,程序将在不到一秒的时间内移动到下一个open
行。 因此,我想弄清楚为什么系统调用有时会被跳过。
该脚本在bash shell会话中运行,脚本头中包含以下内容:
#! /usr/bin/perl
use warnings;
use strict;
我基本上同意@ThisSuitIsBlackNot。 但是,不知道tre-agrep
是什么,很难将该部分翻译成直接的Perl。
也就是说,至少,为什么不跳过输出文件的生成,直接从Perl直接读取Unix输出?
open my $FH, '-|', "awk '(NR+2)%4==0' $infile[$i+$j] | " .
"tre-agrep -ns -E $dist[$a][$b] -k $query[$a][$b]" or die "$!";
while (<$FH>) {
chomp;
my ($field1, $field2) = split /:/, $_, 2;
}
close $FH;
在最坏的情况下,系统调用的标准输出将是空白的,但这不会影响Perl无法读取任何内容(因此不会执行任何操作)。
当然,首先执行一个-e
(存在)调用以确保infile[$i + $j]
不是鬼。
上一篇: perl system call not executing randomly
下一篇: Detect OS type perl