2010-11-09 2 views
0

Для трех скаляров, что такое синтаксис perl для заполнения хэша, в котором один из скаляров является ключом, другой определяет, какой из двух массивов заполнен, а третий добавлен к один из массивов? Например:Заполнение хэш многомерных массивов в 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]. Аналогично, я не знаю, синтаксис для доступа к ним.

ответ

3

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

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

Однако, я бы, наверное, просто сделать хороший/плохой спецификаторов ключи а. А учитывая мои druthers:

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

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

+1

Это делает трюк, спасибо. Я также ценю идею использования хеша хешей вместо этого; Тем не менее, мне придется реорганизовать некоторые другие вещи. – jasper77

1

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

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

не работает для вас?

Смежные вопросы