Простой Perl Opendir - PullRequest
       17

Простой Perl Opendir

0 голосов
/ 31 августа 2010

Я совершенно новичок в Perl и только что изучил его.Я натолкнулся на этот скрипт, который мне нужно запустить и который содержит некоторые данные трассировки Tstat.Тем не менее, я получаю сообщение об ошибке «Не удается разобрать дату».

Код, который генерирует это здесь

foreach my $dir (@trace_dirs) {
 undef @traces;
 opendir(DIR, $dir) || die "Can't open dir: $dir \n";
 @traces = grep { /.out$/ && -d "$dir/$_" } readdir(DIR);
 foreach my $trace (@traces) {
  $trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/;
  $trace_date=&ParseDate("$3/$4/$5 $1:$2") || die "Cannot parse date \n";
  $traces{$trace_date} = $trace;
  $trace_dir{$trace_date} = $dir;
 }
 closedir DIR;
}

Может кто-нибудь сказать мне, что этот код ищет?

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Когда вы сталкиваетесь с подобными проблемами, бросайте себе кость, просматривая данные, с которыми вы пытаетесь поиграть. Убедитесь, что значение в $trace соответствует ожидаемому, а созданная строка даты соответствует ожидаемому:

 print "Trace is [$trace]\n";
 if( $trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/ ) {
     my $date = "$3/$4/$5 $1:$2";
     print "date is [$date]\n";
     $trace_date= ParseDate( $date ) || die "Cannot parse date [$date]\n";
     }

Я предполагаю, что значение в $4, которое, очевидно, является строкой типа 'Jan', 'Feb' и т. Д., Не то, что ParseDate нравится.

Обратите внимание, что вы должны использовать переменные захвата только после успешного сопоставления с образцом, чтобы они не остались после другого совпадения.

1 голос
/ 31 августа 2010

Однако я получаю сообщение об ошибке «Невозможно разобрать дату».

Вы получаете сообщение об ошибке из-за строки:

$trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/;

Сценарий ожидает, что всефайлы в каталоге с расширением .out имеют правильные метки времени в начале своих имен.И в строке скрипта отсутствует обработка ошибок.

Попробуйте добавить здесь некоторую проверку, например:

unless($trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/) {
   warn "WRN: Malformed file name: $trace\n";
   next;
}

Это проверяет, совпадает ли имя файла, и если нет, то предупреждениебудет напечатан и будет пропущен.

В качестве альтернативы вы также можете добавить проверку в строку grep {} readdir():

@traces = grep { /.out$/ && /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/ && -d "$dir/$_" } readdir(DIR);

, чтобы отфильтровать неуместные .out файлы (хм, на самом делекаталоги), прежде чем они достигнут цикла, который вызывает функцию ParseDate.

...