#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, «Босс» и «Статус»