Создание нескольких хэшей из нескольких файлов за один раз - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу выполнить процесс, похожий на vlookup, но с несколькими файлами, в которых содержимое первого столбца из всех файлов (отсортировано в uniq-ed) является справочным значением. Теперь я хотел бы сохранить эти пары ключ-значение из каждого файла в каждом хэше, а затем распечатать их вместе. Примерно так:

file1: while () {$ hash1 {$ key} = $ val} ... file2: while () {$ hash2 {$ key} = $ val} ... file3: while () {$ hash3 { $ key} = $ val} ... и так далее

Затем распечатайте его: напечатайте «$ ref_val $ hash1 {$ ref_val} $ hash3 {$ ref_val} $ hash3 {$ ref_val} ...»

$i=1;
@FILES = @ARGV;
foreach $file(@FILES)
{
open($fh,$file);
$hname="hash".$i; ##trying to create unique hash by attaching a running number to hash name
while(<$fh>){@d=split("\t");$hname{$d[0]}=$d[7];}$i++;
}
$set=$i-1;       ##store this number for recreating the hash names during printing

open(FH,"ref_list.txt");
while(<FH>)
{
chomp();print "$_\t";
## here i run the loop recreating the hash names and printing its corresponding value
for($i=1;$i<=$set;$i++){$hname="hash".$i; print "$hname{$_}\t";}
print "\n";
}

Теперь, когда я застрял, perl принимает в качестве имени хеша $ hname вместо $ hash1, $ hash2 ...

Заранее спасибо за помощь и мнения

1 Ответ

0 голосов
/ 10 ноября 2018

Показанный код пытается использовать символические ссылки для создания имен переменных во время выполнения. Эти вещи могут вызвать много проблем и не должны использоваться, за исключением очень редких случаев в очень специализированном коде.

Вот способ прочитать несколько файлов, каждый в хэш, и сохранить их для дальнейшей обработки.

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:, за которым следуют значения для этой строки, по одному из каждого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...