Показанный код пытается использовать символические ссылки для создания имен переменных во время выполнения. Эти вещи могут вызвать много проблем и не должны использоваться, за исключением очень редких случаев в очень специализированном коде.
Вот способ прочитать несколько файлов, каждый в хэш, и сохранить их для дальнейшей обработки.
use warnings;
use strict;
use feature 'say';
use Data::Dump qw(dd);
my @files = @ARGV;
my @data;
for my $file (@files) {
open my $fh, '<', $file or do {
warn "Skip $file, can't open it: $!";
next;
};
push @data, { map { (split /\t/, $_)[0,6] } <$fh> };
}
dd \@data;
Каждый хеш связывает первый столбец с седьмым (индекс 6), как пояснено, для каждой строки. Ссылка на такой хеш для каждого файла, образованного { }
, добавляется в массив.
Обратите внимание, что когда вы добавляете пару ключ-значение в хеш, который уже имеет этот ключ, новый перезаписывает старый. Таким образом, если строка повторяется в первом столбце файла, хэш для этого файла заканчивается значением (столбец 7) для последнего. ФП не обсуждает возможные дубликаты такого рода в файлах данных (только для справочного файла), уточните, если необходимо.
Data :: Dump используется только для печати; если вы не хотите устанавливать его, используйте ядро Data::Dumper
.
Я не уверен, что я использую этот «справочный файл», но теперь вы можете просматривать массив ссылок на хеш для каждого файла и извлекать значения по мере необходимости. Возможно, как
open my $fh_ref, '<', $ref_file or die "Can't open $ref_file: $!";
while (my $line = <$fh_ref>) {
my $key = ... # retrieve the key from $line
print "$key: ";
foreach my $hr (@data) {
print "$hr->{$key} ";
}
say '';
}
Будет напечатано key:
, за которым следуют значения для этой строки, по одному из каждого файла.