26

いくつかの追加機能を追加するために、いくつかの既存のコードを変更するように依頼されました。Google で検索しましたが、答えが見つからないようです。私はこの効果に何かを持っています...

%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 行で、124 と 143 はハッシュにアクセスする場所です。これらのエラーを調べると、ハッシュが初期化されていないようです。ただし、ハッシュに値があることは確認できます。これらのエラーが発生するのはなぜですか?

4

5 に答える 5

27

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

do_stuff_with_hashes(\%first_hash, \%second_hash);

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

my $first_hash  = shift;
my $second_hash = shift;
于 2009-07-21T18:56:15.750 に答える
9

他の人が指摘しているように、ハッシュ参照は行くべき道です。

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

do_stuff_with_hashes( { gen_first_hash() }, { gen_second_hash() } );

ここでは、do_stuff_with_hashes 関数で使用するハッシュ参照をその場で (関数呼び出しを中括弧で囲んで) 作成しているだけです。これは特別なことではなく、他の方法も同様に有効で、おそらくより明確です。これは、Perl を初めて使用する人が旅行中にこのアクティビティを見かけた場合に役立つ可能性があります。

于 2009-07-21T19:11:53.377 に答える
7

最初に、

 do_stuff_with_hashes(%first_hash, %second_hash);

ハッシュをリストに「ストリーム」します。次と同等です。

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

そして、それらの項目の 1 つだけを選択します。そう、

 my %first_hash = shift;

は次のように言っています。

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

は何にもマッピングされない{ 'key1' }ため、のようなハッシュを持つことはできません。'key1'

于 2009-07-21T19:00:24.837 に答える