исключить некоторые строки из набора данных - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь получить какую-то строку из моего набора данных.

#!/usr/local/bin/perl
use Date::Calc qw(Add_Delta_Days); 
my @just_ecps;
my @folder_dates;
my @ecp_dot_tee_array = `grep ISLAND ~/data/files/grit.t`;
foreach (@ecp_dot_tee_array){
      ($ecp, undef, undef, undef, undef, undef) = split (/\s+/, $_);
         push (@just_ecps, $ecp);
}
for ($h = 1; $h <= 5; $h++){

   my (undef, undef, undef, $day, $month, $year) = localtime();
   $year+=1900;
   $month+=1;
   ($year, $month, $day) = Add_Delta_Days($year, $month, $day, -$h );
   if ($month < 10 ){
      $month = "0$month";
   }
   if ($day < 10 ){
      $day = "0$day";
   }
push (@folder_dates, "$year$month$day");
}

for ( $j=0; $j <=$#just_ecps ; $j++){
   for ($x=0; $x<=$#folder_dates ; $x++){
      open FILEHANDLE , "zmore /data/ibprod/archive/$folder_dates[$x]/$just_ecps[$j]  /ghistogram.gz | ";
      @archive_average = (<FILEHANDLE>);
      foreach $line(@archive_average){
         if ($line =~ /ave:\s+(\d+\.\d+)\s/){
            print $1;
            sleep 1;
            print "\n";
         }
      }
   }
}

Это то, что я получаю, когда запускаю программу - я пытаюсь получить 'не могу прочитать> файлы из набора данных

% ./read_in_ghistogram2
0.00414601
0.0044511
0.00387373
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd1/ghistogram.gz: No such  file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd1/ghistogram.gz: No such file or directory
0.00309721
0.00302753
0.00307702
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd2/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd2/ghistogram.gz: No such file or directory 
0.00324729
0.00295381
0.00301736
/usr/bin/zmore: line 52: /home/data/archive/20110814/islnd3/ghistogram.gz: No such file or directory
/usr/bin/zmore: line 52: /home/data/archive/20110813/islnd3/ghistogram.gz: No such file or directory

Я попытался отфильтровать ихвне цикла while, но он не работает, и в программе нет строки 52, он идет только к 42

for ( $j=0; $j <=$#just_ecps ; $j++){
   for ($x=0; $x<=$#folder_dates ; $x++){
      #print "/home/ibprod_archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
      open FILEHANDLE , "zmore /data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz | ";
      while (<FILEHANDLE>) {
          next if ($_ =~ '/No such file or directory/');
          push (@archive_average,$_);
          foreach $line(@archive_average){
             if ($line =~ /\save:\s+(\d+\.\d+)\s/){
               print $line;
               sleep 1;
             }
         }
      }
   }

1 Ответ

2 голосов
/ 18 августа 2011

Line 52 относится к строке в скрипте zmore, а не в вашем скрипте perl.

Чтобы устранить проблему, проверьте, существует ли файл в вашем скрипте perl, прежде чем передавать его чему-либо другому..

my $archive = "/data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
next unless (-r $archive);

-r проверяет, что файл существует и доступен для чтения текущим пользователем.Таким образом, next unless (-r $file) перейдет к следующей итерации цикла, если файл не существует и не доступен для чтения.

(Это очень редко - если что-то удаляет (или меняет владельца) эти файлы, когда вы пытаетесь прочитатьих, open может все еще потерпеть неудачу. Если это не чувствительно к безопасности, то это не слишком беспокоит, но имейте это в виду.)

Два совета:

  • zmore предназначен для использования людьми, а не сценариями.Ваш скрипт не заботится об одном бите, если вывод разбит на страницы.Поэтому вы должны использовать gunzip -c $file (или, может быть, gzip -cd, если у вас нет gunzip, не уверен насчет этого).
  • Всегда проверяйте, что open успешно, иначе вы будетепытаясь в какой-то момент манипулировать недействительными файловыми дескрипторами, что приведет к большему количеству ошибок.И всегда close то, что вы открыли.

Поэтому я бы изменил ваш скрипт на:

my $archive = "/data/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
next unless (-r $archive);
if (!open(FILEHANDLE, "<", "gunzip -c $archive|")) {
  print STDERR "Error processing $archive: $!\n"; # optional
  next;
}
while (<FILEHANDLE>) {
  ...
}
close FILEHANDLE;

Наконец, сообщение об ошибке zmore выводится в STDERR.Если все, что вам нужно, это скрыть эти сообщения (а не исправить их), просто перенаправьте их в файл журнала (или /dev/null):

% ./read_in_ghistogram2 2> errors.log
...