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 在评论中所说,您的问题的技术答案可以在Get variable name as string in Perl的答案中找到

但是,您应该考虑您是否在做正确的事情?

如果您以某种方式需要知道哈希的名称,那么如果您将这些多个哈希存储到一个以名称为键的哈希中,您很可能会更好地解决问题(正如您提到的那样,您应该熟悉在你的问题中的方法)。

于 2012-08-10T18:06:02.127 回答
2

您可以使用名称来引用散列,但散列本身没有名称。例如,考虑以下情况:

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

请记住哈希包含(x=>3, y=>4):哈希是无名的吗?命名为“富”?命名为“酒吧”?上述所有的?以上都不是?

您可以做的最好的事情是使用PadWalker来近似答案。我建议不要在生产中使用它或类似的东西(即任何能找到名字的东西)!

于 2012-08-10T18:14:34.043 回答
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 回答
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 回答