どのようにhashmapの配列の値を参照するには?

perlでは、hashmapの配列の値を参照する方法は?例えば、

my %person1 = (
id => 3,
name=> 'George',
age => 29,
);

my %person2 = (
id => 3,
name=> 'George',
age => 29,
);

my @persons = ( \%person1, \%person2 );
print $persons[0]->id;  #wrong
2

2 答え

id がハッシュキーであることを示す必要があります。試す

print $persons[0]->{id};
3
追加された
ところで、矢印は配列インデックスまたはハッシュキーの後にオプションです。
追加された 著者 choroba,
@チョロバ - 良い点!
追加された 著者 Ted Hopp,

さて、あなたは、Perlの参考文献を載せていますので、オブジェクト指向のPerl を見てみてください。

package Person;

sub new {
   my $class = shift;
   %params = @_;

   my $self = {};
   bless $self, $class;

   $self->Id($params{id});
   $self->Name($params{name});
   $self->Age($params{age});

   return $self;
}

sub Id {
   my $self = shift;
   my $id   = shift;

   if (defined $id) {
      $self->{ID} = $id;
   }
   return $self->{ID};
}

sub Name {
   my $self = shift;
   my $name = shift;

   if (defined $name) {
      $self->{NAME} = $name;
   }
   return $self->{NAME};
}

sub Age {
   my $self = shift;
   my $age  = shift;

   if (defined $age) {
      $self->{AGE} = $age;
   }
   return $self->{AGE};
}

さて、新しい人を定義するには、次のようにします。

my $person = Person->new(id => "3", name => "George", age => 29);

または:

my $person = Person->new();
$person->Name("George");
$person->Id("3");
$person->Age(29);

そして、あなたは次のように配列にそれらを押し込むことができます:

push @persons, $person;

そして、あなたは次のようにIDを印刷することができます:

print $persons[0]->Id;

だから、なぜこのトラブルのすべてを克服するのですか?

恐竜が地球を支配し、誰もがPerl 3.0でプログラミングしていた古代の時代に戻ってみましょう。当時、あなたは変数を宣言するという概念を持っていませんでした。これはこれを行うのが非常に簡単だったことを意味しました:

$name = "bob";
print "Hello, my name is $Name\n";

うわー! $ name を割り当てましたが、printステートメントは $ Name を使用しました。

これは、 strict と事前宣言された変数を使用できるようになった現在、Perl 4.0で廃止されました。

use strict;
my $name = "bob";
print "Hello, my name is $Name\n";

これは、 $ Name を宣言していないため、エラーが発生します。エラーメッセージが表示され、すぐに問題を解決します。

ここで、Perl 5.0では、参照を使用する権利を与えられた神が与えられています。もう一度、Perl 5.0には、宣言されていないハッシュ名の使用を妨げるものがないため、Perl 3.0に戻ります。

use strict;
my $person = {};
$person->{Name} = "bob";

print "My name is $person->{name}\n";

おっと、ハッシュキー name はありません。ハッシュキー Name です。

オブジェクト指向のPerlでは、次のようなタイプのエラーをチェックすることができます。

my $person = Person->new();
$person->Name("Bob");
print "My name is " . $person->name;

クラス(別名パッケージ)Personにメンバー関数(別名サブルーチン) name がないため、エラーです。

あなたのプログラムがより複雑になるにつれて、これは命を救う人として見いだされます。

もちろん、オブジェクトを使用することによって、コードの変更がどこに発生するかを制限することができます。たとえば、突然、一人一人の給料を追跡しなければならないとしましょう。オブジェクト指向のアプローチがなければ、プログラム全体を調べて @persons 配列またはその中の要素をどのように操作しているかを確認する必要があります。

オブジェクト指向プログラムでは、Salaryという新しいメソッドを作成するだけです。

sub Salary {
   my $self = shift;
   my $salary = shift;

   if (defined $salary) {
      $self->{SALARY} = $salary;
   }
   return $self->{SALARY};
}

そして、あなたはすべて完了です。

Perlプログラミングのこのアプローチにもっと慣れ親しむようになると、あなたのプログラムが扱うさまざまなオブジェクトについてまず考えてから、クラスメソッドを使用します。あなたはプログラミングがより速く、エラーを起こしにくいことがわかります。

申し訳ありませんが、講演には時間がかかりましたが、ハッシュ配列のハッシュを使って長い時間を費やしていました。これらの複雑すぎるものを動作させるために多くの時間を浪費していました。私は誰かが私にオブジェクト指向のPerlをもっと早く指摘して欲しいと願っていました。

0
追加された