2

簡単な質問のようなものですが、それは私を困惑させ、グーグルは私を迷わせます。ハッシュの名前を出力するだけです。例えば:

&my_sub(\%hash_named_bill);

&my_sub(\%hash_named_frank);

sub my_sub{

    my $passed_in_hash = shift;

    # do great stuff with the hash here

    print "You just did great stuff with: ". (insert hash name here);

}

私が知らない部分は、括弧内のものを取得する方法です(挿入...)。ネストされたハッシュの場合、「keys」タグを使用してハッシュ名を取得できます(それらを呼び出したい場合)。ハッシュ名全体を取得する方法がわかりませんが、実際には別のキーのようです。

4

4 に答える 4

9

@hackattackがコメントで述べたように、あなたの質問に対する技術的な答えは、Perlで変数名を文字列として取得するための答えにあります。

しかし、あなたはあなたが正しいことをしているのかどうかを考慮する必要がありますか?

どういうわけかハッシュの名前を知る必要がある場合は、名前がキーであるハッシュのハッシュにそれらの複数のハッシュを隠しておくと、問題をよりよく解決できる可能性があります(これは、あなたの質問のアプローチ)。

于 2012-08-10T18:06:02.127 に答える
2
$hash_named_bill{name} = "bill";
$hash_named_frank{name} = "frank";

&my_sub(\%hash_named_bill);
&my_sub(\%hash_named_frank);

sub my_sub{

    my $passed_in_hash = shift;

    # do great stuff with the hash here

    print "You just did great stuff with: ". $passed_in_hash->{name};

}
于 2012-08-10T18:04:41.160 に答える
2

名前を使用してハッシュを参照できますが、ハッシュ自体には名前がありません。たとえば、次のことを考慮してください。

*foo = {};
*bar = \%foo;
$foo{x} = 3;
$bar{y} = 4;

ハッシュに含まれるものを覚えておいて(x=>3, y=>4)ください:ハッシュは無名ですか?「foo」という名前?「バー」という名前?上記のすべて?上記のどれでもない?

あなたができる最善のことは、PadWalkerを使用して答えを概算することです。本番環境でそれまたは同様のもの(つまり、名前を見つけるもの)を使用しないことをお勧めします!

于 2012-08-10T18:14:34.043 に答える
1

ハッシュは単なるメモリの一部であり、名前(または複数)を関連付けることができます。

変数の名前を出力したい場合、それはあまり単純ではなく(haccattackコメントを参照)、匂いもあまり良くありません(本当に必要ですか?)

(これがシナリオに適合する場合)「ソフト(またはシンボリック)参照」を検討することもできます。

%hash1 = ( x => 101, y => 501);
%hash2 = ( x => 102, y => 502);

my_sub("hash1");
#my_sub(\%hash1);  # won't work
my_sub("hash2");

sub my_sub {
        my $hashname = shift;
        print "hash name: $hashname\n";
        print $hashname->{x} . "\n";
}

ここでは、変数への(ハード)参照ではなく、変数の名前を関数に渡します。Perlでは、これは逆参照(コメント解除を試してください)の時点では同等であると感じmy_sub(\%hash1);ますが、まったく異なることに注意してください。

于 2012-08-10T18:04:56.963 に答える