3

私は Perl 関数について知っておりkeys()、自分が持っているハッシュでそれを使用したいと考えていますが、それに変数を設定する理由がわかりません。コードで 2 つの方法で説明します。

普通:

my %hash = ReturnsHash();
foreach (keys(%hash)) {
    ...code...
}

私が望む方法:

foreach (keys(ReturnsHash())) {
    ...code...
}

2 番目の方法でこのエラー メッセージが表示されます( Type of arg 1 to keys must be hash or array (not subroutine entry)) 2 番目の方法は可能ですか? もしそうなら、どのように?

4

4 に答える 4

15

その名前に反してReturnsHash、ハッシュを返しません。サブがハッシュを返すことは不可能です。サブルーチンはスカラーのリストのみを返すことができます。もしあなたがそうするなら

sub ReturnsHash {
   my %hash = ( a => 1, b => 2 );
   return %hash;
}

あなたはやっている

return 'a', 1, 'b', 2;

できないから

keys('a', 1, 'b', 2)

あなたにはできない

keys(ReturnsHash())

さて、代わりにできることは、ハッシュへの参照を返すことです

sub ReturnsHashRef {
   my %hash = ( a => 1, b => 2 );
   return \%hash;
}

別名

sub ReturnsHashRef {
   return { a => 1, b => 2 };
}

その場合、あなたはすることができます

keys(%{ ReturnsHashRef() })
于 2013-03-05T17:22:19.893 に答える
3

「ハッシュを返す」関数などはありません。あなたが持っている場合

sub foo {
    ...
    return %hash;
}

my %h = foo();

その場合、fooは「ハッシュを返しません」。のキーと値のリストを返します%hash。そのリストは、新しいハッシュを作成するために使用されます%h。Joelが言ったように、ハッシュへの参照keys %$hrefを返す場合、それは理にかなっていますが、keys最初にハッシュに割り当てずにリストを実行することはできません。

于 2013-03-05T17:19:39.780 に答える
1

私はあなたがそれを持っていると思います。関数からハッシュ参照を返すだけで、foreachブロック内でキーが変数に格納され$_ます。次に例を示します。

sub ReturnsHash {

    return { key1 => 'value1', key2 => 'value2' };
}

foreach (keys(%{ReturnsHash()})) {
    print 'key:=' . $_ . "\n";
}
于 2013-03-05T17:12:05.370 に答える
1

hash返品できるのに、かさばる全体を返品する必要はありませんhash reference

私はいつも返品に行きhash referenceます。

sub return_hash() {
   ## Code 
   return \%hash;
}

そしてそれを次のように受け取ります

foreach (keys(%{ return_hash() })) {
 ## code
}

そしてもう 1 つ、a で始まるすべての関数名small case letterと で区切られた単語を記述することは、常に適切なコーディング規則と見なされ_ます。

于 2013-03-05T17:25:45.070 に答える