Как я могу хранить несколько значений в хэш-таблице Perl?

До недавнего времени я сохранял несколько значений в разных хэшах с одними и теми же ключами следующим образом:

%boss = (
    "Allan"  => "George",
    "Bob"    => "George",
    "George" => "lisa" );

%status = (
    "Allan"  => "Contractor",
    "Bob"    => "Part-time",
    "George" => "Full-time" );

а затем я могу сослаться на $boss("Bob") и $status("Bob"), но это становится громоздким, если у каждого ключа может быть много свойств, и мне приходится беспокоиться о синхронизации хэшей.

Есть ли лучший способ хранения нескольких значений в хеше? Я мог бы хранить значения как

        "Bob" => "George:Part-time"

а потом разобрать струны с расколом, но должен же быть более элегантный способ.


person paxdiablo    schedule 10.10.2008    source источник
comment
Это отличное напоминание о том, почему кулинарная книга по структуре данных Perl является таким замечательным ресурсом.   -  person dreftymac    schedule 10.07.2013


Ответы (4)


Это стандартный способ, согласно perldoc perldsc.

~> more test.pl
%chums = ( "Allan" => {"Boss" => "George", "Status" => "Contractor"},
           "Bob" => {"Boss" => "Peter", "Status" => "Part-time"} );

print $chums{"Allan"}{"Boss"}."\n";
print $chums{"Bob"}{"Boss"}."\n";
print $chums{"Bob"}{"Status"}."\n";
$chums{"Bob"}{"Wife"} = "Pam";
print $chums{"Bob"}{"Wife"}."\n";

~> perl test.pl
George
Peter
Part-time
Pam
person Vinko Vrsalovic    schedule 10.10.2008
comment
Это выглядит нормально. Я думаю, я могу добавить еще одного приятеля с $chums{Greg} = {Boss => Lisa, Status => Fired}, но как мне добавить жену к Бобу? Будет ли это $chums{Bob}{Wife} = Кэрол? - person paxdiablo; 10.10.2008
comment
Кроме того, почему -›. Вроде и без них работает. - person paxdiablo; 10.10.2008
comment
TIMTOWDI :), можно и без них, и да, ваш способ добавления жены правильный - person Vinko Vrsalovic; 10.10.2008
comment
Это отличное напоминание о ценности perldsc. Это должно быть обязательным чтением для программистов PHP, Python, Ruby и Perl. - person dreftymac; 10.07.2013

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

Как насчет чего-то вроде этого:

#!/usr/bin/perl
package Employee;
use Moose;
has 'name' => ( is => 'rw', isa => 'Str' );

# should really use a Status class
has 'status' => ( is => 'rw', isa => 'Str' );

has 'superior' => (
  is      => 'rw',
  isa     => 'Employee',
  default => undef,
);

###############
package main;
use strict;
use warnings;

my %employees; # maybe use a class for this, too

$employees{George} = Employee->new(
  name   => 'George',
  status => 'Boss',
);

$employees{Allan} = Employee->new(
  name     => 'Allan',
  status   => 'Contractor',
  superior => $employees{George},
);

print $employees{Allan}->superior->name, "\n";
person tsee    schedule 10.10.2008
comment
Преимущество этого в том, что его можно улучшить в будущем. - person Brad Gilbert; 10.10.2008

Хэши могут содержать другие хэши или массивы. Если вы хотите ссылаться на свои свойства по имени, сохраните их как хэш для каждого ключа, в противном случае сохраните их как массив для каждого ключа.

Существует справочник по синтаксису.

person moonshadow    schedule 10.10.2008

%chums = ("Аллан" => {"Босс" => "Джордж", "Статус" => "Исполнитель"}, "Боб" => {"Босс" => "Питер", "Статус" => " Неполная занятость"} );

отлично работает, но есть ли более быстрый способ ввода данных?

Я думаю о чем-то вроде

%chums = (qw, x)(Статус Аллан Босс Джордж Подрядчик Боб Босс Статус Питер Неполный рабочий день)

где x = количество вторичных ключей после первичного ключа, в данном случае x = 2, "Босс" и "Статус"

person user3127931    schedule 22.12.2013