Так как вы хотите сопоставить имена с именем файла. Данные показывают, что вы получаете список
имен, а затем имя файла. Таким образом, вам нужно будет хранить ключи до
Вы знаете, что вы можете хранить их.
Кроме того, поскольку вы ничего не сказали о названиях штатов, я думаю, вы хотите
игнорировать их. Поэтому нам нужен способ отличить их друг от друга. К счастью, штаты
четко определенный набор, и может быть помещен в таблицу поиска.
Тогда нам нужен способ отличить имена от имен файлов, от того, что вы показываете, я
идя по следующему шаблону: по крайней мере, один символ слова, затем одна точка,
затем хотя бы один символ слова для расширения.
Так что это скажет мне, находимся ли мы в строке файла, и может разрешить значение
из ожидающих имен.
@ARGV = '/path/to/file';
my %state_hash
= ( Alabama => 1, Alaska => 1, Arizona => 1, ...
, 'New Hampshire' => 1, ..., Wyoming => 1
);
my ( @pending_names, %file_for );
while ( <> ) {
# Extract non-spaces at the beginning of the line
# potentially separated with one-and-only-one space
my ( $name_or_file ) = m/^(?:\S+[ ]?)+)/;
next unless $name_or_file or exists $state_hash{ $name_or_file };
# if the extract value fits the file pattern
if ( $name_or_file =~ m/^\w+\.\w+$/ ) {
# store the name-file combination for each pending
$file_for{ $_ } = $name_or_file foreach @pending_names;
# they are not pending anymore, so clear them.
@pending_names = ();
}
else {
# store up pending names
push @pending_names, $name_or_file;
}
}
То, что вы не просили обработать, является ли это «большой файл», имя
скорее всего, повторится. Если имя будет повторяться более одного раза, вы будете сбивать значение
Вы экономите в прошлый раз.
Это может быть исправлено путем push
-наложения в слот хеша, а не просто назначением его. Вот так:
push @{ $file_for{ $_ } }, $name_or_file foreach @pending_name;