Заполнение хэша многомерных массивов в perl - PullRequest
0 голосов
/ 10 ноября 2010

Учитывая три скаляра, каков синтаксис perl для заполнения хэша, в котором один из скаляров является ключом, другой определяет, какой из двух массивов заполнен, а третий добавляется к одному из массивов?Например:

my $weekday = "Monday";
my $kind    = "Good";
my $event   = "Birthday";

и учитывая только скаляры, а не их конкретные значения, полученные внутри цикла, я хочу хеш-код:

my %Weekdays = {
      'Monday' => [
                    ["Birthday", "Holiday"],     # The Good array
                    ["Exam", "Workday"]          # The Bad array
                  ]
      'Saturday' => [
                    ["RoadTrip", "Concert", "Movie"],
                    ["Yardwork", "VisitMIL"]
                  ]
}

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

push( @{ $Weekdays{$weekday} }, $event);

Используется в цикле, который может дать мне:

%Weekdays = {
        'Monday' => [
                    'Birthday',
                    'Holiday',
                    'Exam',
                    'Workday'
                    ]
}

Я полагаю, ключ хешаэто конкретный день недели, и значение должно быть двумерным массивом.Я не знаю синтаксиса perl, чтобы, скажем, вставить день рождения в хеш как элемент [0] [0] массива дня недели, и в следующий раз в цикле, вставить другое событие как [0] [1] или[1] [0].Точно так же я не знаю синтаксис для доступа к нему.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Используя ваши переменные, я бы написал так:

push @{ $Weekdays{ $weekday }[ $kind eq 'Good' ? 0 : 1 ] }, $event;

Тем не менее, я бы, вероятно, просто сделал бы спецификаторы Good / Bad keys . И учитывая мои барабанщики:

use autobox::Core; 
( $Weekdays{ $weekday }{ $kind } ||= [] )->push( $event );

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

1 голос
/ 10 ноября 2010

Есть ли причина, по которой

 push @{ $Weekdays{Monday}[0] }, "whatever";

у вас не работает?

...