Perl open3读取gnuplot块的管道句柄

Posted

技术标签:

【中文标题】Perl open3读取gnuplot块的管道句柄【英文标题】:Perl open3 read pipe handles of gnuplot block 【发布时间】:2012-03-16 14:17:27 【问题描述】:

我有以下函数来使用 perl + gnuplot 绘制数据。输入数据文件非常多,其中大约一半产生无效范围,我想检测并删除那些坏文件。该函数只处理一个文件,我无法让它读取任何 gnuplot 输出,它只是阻塞。我尝试阅读 GPR/GPE 是徒劳的。

sub plot_file 
  my $filename = shift;
  if ($filename =~ m![^\/]+/([^.]+)\.([^.]+)\.([^.]+)!) 
    my ($node, $box, $metric) = ($1, $2, $3);
    my $plot_file = "plots/$node.$box.$metric.eps";
    if ($metric !~ /Sqr/) 
      open3(\*GPW, \*GPR, \*GPE, "$gnuplot") or die "no gnuplot";
      print GPW "set terminal postscript 'Consola' 12\n";
      print GPW "NODE      = '$node'\n";
      print GPW "BOX       = '$box'\n";
      print GPW "METRIC    = '$metric'\n";
      print GPW "DATA_FILE = '$filename'\n";
      print GPW "OUT_FILE  = '$plot_file'\n";
      print GPW "set size 1.0,0.5\n";
      print GPW "set title BOX.' - '.NODE.' - '.METRIC\n";
      print GPW "set output OUT_FILE\n";
      print GPW "plot DATA_FILE using 1:2 with lines notitle\n";
      my $skip;
      while (<GPE>) 
        if (/Warning/) 
          system ("rm $plot_file");
          $skip = 1;
          last;
        
      
      if (not $skip) 
        system ("epstopdf $plot_file");
      
    
  

【问题讨论】:

【参考方案1】:

在您关闭该命令的输入流以告知该命令不再需要输入之前,外部命令可能不会产生任何输出。 打电话

close GPW;

在您最后的 print GPW ... 声明之后。

【讨论】:

以上是关于Perl open3读取gnuplot块的管道句柄的主要内容,如果未能解决你的问题,请参考以下文章

perl中管道文件句柄的问题

Perl 行为差异关闭由 open() 产生的子进程与 IPC::Open3

Perl:当子/管道的文件句柄被别名时,关闭子进程失败

IPC::Open3 在 Apache 下运行失败

Perl:open3 但对于 n 个文件描述符

perl IPC:Open3 最小通过 perlcritic?