2009-07-21 9 views
22

いくつかの既存のコードを変更して、いくつかの追加機能を追加するように求められました。私はGoogleで検索し、答えを見つけることができないようです。私は、私は次のエラーを取得しています。この効果に何か...Perlでサブルーチンの引数としてハッシュを使用するにはどうすればよいですか?

%first_hash = gen_first_hash(); 
%second_hash = gen_second_hash(); 
do_stuff_with_hashes(%first_hash, %second_hash); 

sub do_stuff_with_hashes 
{ 
    my %first_hash = shift; 
    my %second_hash = shift; 

    # do stuff with the hashes 
} 

を持っている:

Odd number of elements in hash assignment at ./gen.pl line 85. 
Odd number of elements in hash assignment at ./gen.pl line 86. 
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 124. 
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 143. 

ライン85と86は、サブ・ルーチンの最初の2行で、どこI 124と143は、ハッシュにアクセスしています。これらのエラーを調べると、私のハッシュが初期化されていないことが示唆されているようです。ただし、ハッシュに値があることを確認できます。なぜこれらのエラーが表示されますか?

+1

これは複製です。 http://stackoverflow.com/questions/944784/を見てください – innaM

答えて

24

ハッシュは、それらを関数に渡すとフラットリストに折りたたまれています。したがって、関数の引数から値をシフトすると、1つの値しか得られません。あなたがしたいことは、参照によってハッシュを渡すことです。

ただし、参照としてハッシュを使用する必要があります。

my $first_hash = shift; 
my $second_hash = shift; 
+0

私は見る...それはトリックでした...ありがとう! – predhme

5

まず第一に、

do_stuff_with_hashes(%first_hash, %second_hash); 

はと同等、リストにハッシュを "ストリーム":

('key1_1', 'value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ...) 

、その後、あなたはいずれかを選択し、それらのアイテムの一つだけ。

my %first_hash = 'key1_1'; 
# leaving ('value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ...) 

'key1'が何にマッピングされるので、あなたは、{ 'key1' }のようなハッシュを持つことはできません:だから、

my %first_hash = shift; 

は言ってようなものです。

+1

何が起こっているのかを説明してくれてありがとう。 – predhme

9

ハッシュリファレンスは、他の人が指摘しているように、行く方法です。

これはちょうどキックのために別の方法を提供します...誰が一時変数を必要とするのか?

あなたは自分のdo_stuff_with_hashes機能で使用する(関数呼び出しの周りの中括弧を経由して)その場でハッシュリファレンスを作成している。ここ
do_stuff_with_hashes({ gen_first_hash() }, { gen_second_hash() }); 

。これは特別なものではなく、他の方法も有効で、おそらくより明確です。これは、あなたの旅行でこの活動がPerlを初めて知った人として見える場合、道を助けるかもしれません。

少し遅れ
+0

すばらしいトリック!病気の周りを保つ。 – predhme

+0

うれしいです。あなたがPerlを使いこなしているのを心に留めておくべきことは、誰もが "それを行う方法は複数あります"ということを指摘することです。あなたの意見にもよるが、これは祝福と呪いのようなものだ)をPerlプログラミングで使う。楽しむ! –

14

しかし、

としては、あなたが言及、ないハッシュを渡す必要があり、明記されています。

ただし、ハッシュを使用する必要がある場合は、即座に参照を解除することがあります。

sub do_stuff_with_hashes { 
    my %first_hash = %{shift()}; 
    my %second_hash = %{shift()}; 
}; 
+0

は明らかですが、私はハッシュをデリファレンスしていません、私はそれらをコピーしています。 – larelogio

関連する問題