В этом случае if (/DID/)
по умолчанию ищет переменную $_
, так что это правильно.Тем не менее, это довольно слабое регулярное выражение, ИМО.
Цикл while в сабвуфере может быть необходим, это зависит от того, как выглядит ваш ввод.Вы должны знать, что два цикла while приведут к тому, что некоторые строки будут полностью пропущены.
Цикл while в основной программе будет занимать одну строку и ничего с этим не делать.По сути, это означает, что первая строка в файле и каждая строка, следующая непосредственно за совпадающей строкой (например, строка, содержащая «DID», а 4-е поле - это число), также будет отброшена.
InЧтобы правильно ответить на этот вопрос, нам нужно увидеть входной файл.
У этого кода есть ряд проблем, и если он работает, как задумано, это, вероятно, связано с большим количеством удачи.
Ниже приведена очищенная версия кода.Я держал модули внутри, так как я не знаю, используются ли они в другом месте.Я также сохранил выходной файл, так как он может быть использован там, где вы не показали.Этот код не будет пытаться использовать неопределенные значения для get_country
и просто ничего не будет делать, если не найдет подходящего числа.
use warnings;
use strict;
use Scalar::Util qw/ looks_like_number /;
use WWW::Mechanize;
my @file_list=qw{ blah.txt };
open(my $outfile, '>', 'outputfile.txt') or die "Can't open output file: $!";
for my $file (@file_list) {
open(my $in_file, '<', $file) or die "Can't read source file: $!";
print "Processing file $file\n";
while (my $citing_pat = get_number($in_file)) {
get_country($citing_pat);
}
}
close $out_file;
sub get_number {
my $fh = shift;
while(<$fh>) {
if (/DID/) {
my $field = (split)[3];
if($field =~ /^\d+$/){
return $field;
}
}
}
return undef;
}