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

#perl #hash #multiple-value #perl-data-structures

Вопрос:

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

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

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

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

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

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

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

Комментарии:

1. Это отличное напоминание о том, почему поваренная книга структуры данных Perl является таким отличным ресурсом.

Ответ №1:

Это стандартный способ, в соответствии с 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
 

Комментарии:

1. Это выглядит нормально. Я думаю, я могу добавить еще одного приятеля с $chums{«Грег»} = {«Босс» => «Лиза», «Статус» =>> «Уволен»}, но как мне добавить жену Бобу? Будет ли это $chums{«Боб»}{«Жена»} = «Кэрол»?

2. Кроме того, почему «->». Кажется, он функционирует и без них.

3. TIMTOWDI :), вы можете использовать его без них, и да, ваш способ добавить жену правильный

4. Это отличное напоминание о ценности perldsc. Это должно быть обязательным чтением для программистов PHP, Python, Ruby и Perl.

Ответ №2:

Хэши хэшей-это то, о чем вы явно просите. В документации 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";
 

Комментарии:

1. Это имеет то преимущество, что оно может быть улучшено в будущем.

Ответ №3:

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

Существует ссылка на синтаксис.

Ответ №4:

 my %employees = (
    "Allan" => { "Boss" => "George", "Status" => "Contractor" },
);

print $employees{"Allan"}{"Boss"}, "n";
 

Ответ №5:

%приятели = ( «Аллан» => {«Босс» =>> «Джордж», «Статус» =>>> «Подрядчик»}, «Боб» =>>>> {«Босс» = > > > > > «Питер», «Статус» = > > > > > > «Неполный рабочий день»} );

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

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

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

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