2016-07-21 6 views
0

私はちょうどいくつかのゲッターとセッターメソッドを持っている小さなクラスを書いています。これらのプロパティの1つはハッシュです。オブジェクトからハッシュにアクセスする方法

sub getMyData 
{ 
    my $objekt = shift; 
    return $objekt->{MYDATA}; 
} 

sub setMyData 
{ 
    my $objekt = shift; 
    my %myData= shift; 

    $objekt->{MYDATA} = \%myData; 
} 

私は私のクラスにアクセスする別のskriptでこのように値を設定する場合:私はちょうどundefを取得

my $data = $objekt->getMyData; 
print $data{'apple'}; 

my %test; 
$test{'apple'}='red'; 

$objekt = MYNAMESPACE::MYCLASS->new; 
$objekt->setMyData(%test); 

私は私が経由して簡単にこの値にアクセスすることができます思いました値。ダンパから

出力: enter image description here

誰かがここで間違って何を教えてもらえますし、どのように私はgetMyDataにアクセスし、値が「赤」を印刷することができますか?

+2

をed ') 'を' setMyData'に変換します。それはおそらくあなたがしたいことではありません。あなたは 'setMyData(\%test)'を意味するかもしれません。しかし、通常はオブジェクトを使用するときは、ハッシュを前後に渡すのではなく、 'get_data_value( 'apple')'メソッドを使用します。 – Sobrique

+3

コード内の名前は恐ろしいです。ドイツ語の変数名はうまくいけばOKですが、あなたが従うべきベストプラクティスがいくつかあります。 Perl OOPでは、オブジェクトは通常 '$ self'と呼ばれます。 'MYDATA'のような全大文字の名前は、通常、定数にしか使われません(しかし、まれにしか使われません)。 Perlの世界では、CamelCaseではなく変数や関数に名前を付けるのが好きですが、代わりに 'set_my_data'のようなアンダースコアを使用します。それ以外に、あなたは[perlref](http://perldoc.perl.org/perlref.html)と[perlreftut](http://perldoc.perl.org/perlreftut.html)を見てください。 – simbabque

+0

あなたはアクセスしています%dataではなく%data。宣言されていない変数を使用しないようにするには、コードの先頭に 'use strict;'を入れてください – ysth

答えて

3

迂回矢印がありません。あなたはハッシュリファレンス(\%myData)を入れているので、あなたはまた参照を得る。

my $data = $objekt->getMyData; 
print $data->{'apple'}; 
#  ^
#   here 

また、リストを参照者ではなくセッターに渡すので、割り当てを変更する必要があります。 shiftはスカラー(単一)値ですが、%testはリストになります(多くの値)。

sub setMyData 
{ 
    my $objekt = shift; 
    my %myData = @_; 

    $objekt->{MYDATA} = \%myData; 
} 

ただし、コードにはもう少し問題があります。

+0

ありがとうございます。これは私の問題を修正しました。さらに、私はすべての変数とメソッドの名前をperl標準に変更します。 – Sebi

4

shiftは、最初のの要素を削除して返します。サブルーチンの内部では、ベアシフトは@_で動作し、そのサブルーチンに渡されたすべての引数のコピーが含まれています。

本当にここで起こっていることsetMyDataは、このデータが渡されていることである。

setMyData($objekt, 'apple', 'red'); 
  1. setMyDataの最初のshift$objekt
  2. @_から二 shift setMyDataで削除し「りんご」を削除しますが、このシフトの結果をハッシュに割り当てるので、次のようなハッシュが作成されます。 'apple' => undef
  3. あなたはこのハッシュへのリファレンスを取ると、あなたが本当に欲しい$objekt

のMYDATAキーに保管することは、あなたのハッシュに@_の残りの部分を割り当てることです:

sub setMyData { 
    my $objekt = shift; 
    my %myData = @_; 
    # my ($objekt, %myData) = @_; (alternative) 

    $objekt->{MYDATA} = \%myData; 
} 

別のオプションは、代わりにありますsetMyDataにハッシュリファレンスを送信、どのshift動作します:あなたは、R「、 'りんご'( `送っている

sub setMyData { 
    my $objekt = shift; 
    my $myData_ref = shift 

    $objekt->{MYDATA} = $myData_ref; 
} 
$objekt->setMyData(\%test); 
+0

ゲッターがrefを返すので、まだ ' - >'がありません。 – simbabque

+0

@simbabqueあなたはすでにそれに対処しているので、私はそれを残しました:) –

関連する問題