2012-03-16 3 views
2

У меня есть следующая функция для построения данных с использованием perl + gnuplot. Файлы входных данных довольно многочисленны, и около половины из них создают недопустимые диапазоны, и я хочу обнаружить и удалить эти плохие файлы. Функция обрабатывает только один файл, и я не мог заставить его читать какой-либо вывод gnuplot, он просто блокирует. Я пробовал читать GPR/GPE напрасно.Perl open3 чтение ручек трубы блока gnuplot

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 ... заявления.

Смежные вопросы