Подтвердить что ты не робот

Как сохранить несколько значений в хеш-таблице 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"

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

4b9b3361

Ответ 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

Ответ 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";

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

% chums = (qw, x) (Allan Boss George Статус Подрядчик Bob Boss Peter Статус Частичная занятость)

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