Как мне создать и добавить анонимные хеши в известный хеш при выполнении скрипта? - PullRequest
0 голосов
/ 29 октября 2009

Я попытаюсь проиллюстрировать это на примере. Возьмите типичный пример хэша хэшей:

my %HoH = (
    flintstones => {
        lead => "fred",
        pal  => "barney",
    },
    jetsons => {
        lead      => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid  => "bart",
    },
);

В моих целях я хотел бы иметь возможность добавлять неназванные или анонимные хеши в% HOH. Я не буду нуждаться (или не буду в состоянии) определять эти вложенные хеши до времени выполнения. Как я могу сделать это с Perl?

Все, что я прочитал (а я уже читал через Perldocs и Google) уже, кажется, показывает примеры, где определены все подшарики (например, "flintstones", "jetsons" и "simpsons").

Я пытаюсь создать родительский хэш, который будет содержать вложенные хеши со строками из файла CSV:

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

Число необходимых мне хэшей "% LineX" неизвестно до времени выполнения (поскольку они представляют количество строк в CSV, читаемом во время выполнения).

Есть идеи? Если уже неясно ... Я все еще пытаюсь обернуть голову вокруг хешей Perl.

Ответы [ 4 ]

3 голосов
/ 29 октября 2009

Чтобы добавить анонимный хеш во время выполнения, присвойте его так же, как обычный хеш-элемент:

$HoH{key} = { foo => 42 };

или

$HoH{key} = $hash_ref;

или

$HoH{key} = \%hash;
1 голос
/ 29 октября 2009
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}
1 голос
/ 29 октября 2009

Сначала вы создаете хеш из текущей строки, которую вы анализируете

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

или создайте прямую ссылку на хеш

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

Затем вы добавляете его в общий хеш, помня, что вложенные структуры perl просто содержат ссылки на другие структуры.

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

Обновлено Пример для цикла с массивом данных для разбора

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}
0 голосов
/ 29 октября 2009

Каждый раз, когда вы создаете новый хеш из строки данных, вам нужно думать об уникальном ключе для хранения этих данных в вашей верхней хеш-таблице.

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

Теперь keys(%HoH) вернет (несортированный) список, такой как "line1","line2","line3",....
$HoH{"line5"} вернет ссылку на данные для 5-й строки вашего файла.
%{$HoH{"line7"}} довольно уродливый синтаксис, но возвращает хеш-таблицу ваших данных из строки 7.
$HoH{"line14"}{"cell02"} может использоваться для получения определенного фрагмента данных.

...