web-dev-qa-db-ja.com

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"
_

次に分割で文字列を分解しますが、よりエレガントな方法が必要です。

24
paxdiablo

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
26
Vinko Vrsalovic

ハッシュのハッシュはあなたが明示的に求めているものです。これをカバーするチュートリアルスタイルのドキュメント部分がPerlのドキュメントの一部にあります。 Data Structure Cookbook しかし、オブジェクト指向にすることを検討する必要があります。これは、オブジェクト指向プログラミングチュートリアルの典型的な例です。

このようなものはどうですか:

#!/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";
23
tsee

ハッシュには他のハッシュまたは配列を含めることができます。プロパティを名前で参照する場合は、キーごとのハッシュとして保存します。そうでない場合は、キーごとの配列として保存します。

構文のリファレンス があります。

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

print $employees{"Allan"}{"Boss"}, "\n";
2
Swaroop C H

%chums =( "Allan" => {"Boss" => "George"、 "Status" => "Contractor"}、 "Bob" => {"Boss" => "Peter"、 "Status" => "パートタイム"} );

うまくいきますが、データを入力するより速い方法はありますか?

のようなものを考えています

%chums =(qw、x)(Allan Boss George Status Contractor Bob Boss Peter Status Part-time)

ここで、x =主キーの後の副キーの数。この場合、x = 2、 "Boss"および "Status"

0
user3127931