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

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

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

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

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

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

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

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

Ответы [ 5 ]

26 голосов
/ 10 октября 2008

Это стандартный способ, согласно 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
23 голосов
/ 10 октября 2008

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

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

Для синтаксиса имеется ссылка .

2 голосов
/ 10 октября 2008
my %employees = (
    "Allan" => { "Boss" => "George", "Status" => "Contractor" },
);

print $employees{"Allan"}{"Boss"}, "\n";
0 голосов
/ 23 декабря 2013

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

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

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

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

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

...