繁体   English   中英

Perl系统调用不是随机执行的

[英]perl system call not executing randomly

在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是什么,因此很难将该部分转换为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 (exists)调用以确保infile[$i + $j]不会是infile[$i + $j] ,这没有什么坏处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM