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

StackOverflow https://stackoverflow.com/questions/190450

Вопрос

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

%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, но должен быть более элегантный способ.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

% chums = ("Allan" = > {"Boss" = > "George", "Status" Status "= >" Contractor "},            & Quot; Боб & Quot; = & GT; {& Quot; Boss & Quot; = & GT; " Питер " " Статус " = & GT; " Неполный рабочий день "});

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top