2010-08-31 2 views
-1

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

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

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; 
} 

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

+0

Каковы аргументы, передаваемые ParseDate()? Это простая проблема отладки, когда вам нужно проанализировать свои входы, чтобы убедиться, что они именно то, что вы ожидаете от них. – Ether

ответ

2

Когда вы сталкиваетесь с такими проблемами, бросьте себе кости, глядя на данные, с которыми вы пытаетесь играть. Убедитесь, что значение в $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

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

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

$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.

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