如何在Perl中打印哈希名称?

如何在Perl中打印哈希名称?,perl,Perl,这是一个简单的问题,但它让我感到困惑,谷歌只是把我引入歧途。我只想打印出散列的名称。例如: &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: ". (inse

这是一个简单的问题,但它让我感到困惑,谷歌只是把我引入歧途。我只想打印出散列的名称。例如:

&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”标记获取哈希名称(如果您想这样称呼它们)。但是我不知道如何获取整个哈希名称,看起来它实际上只是另一个键。

哈希只是一块内存,一个名称(或多个名称)可以与之关联

$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};

}
如果您想打印变量的名称,这不是很简单(请参阅haccattack注释),而且味道也不太好(您确定您真的需要它吗?)

你也可以(如果这符合你的情况)考虑“软(或符号)引用”:


在这里,您将向函数传递变量的名称,而不是对它的(硬)引用。请注意,在Perl中,这在取消引用它时感觉是等价的(尝试取消注释
my\u sub(\%hash1);
),尽管这是一件完全不同的事情。

正如@hackattack在评论中所说,您的问题的技术答案可以在

但是,你应该考虑你做的是正确的事情吗?


如果您需要知道散列的名称,如果您将这些多个散列存储到以名称为键的散列中(您在问题中提到的方法应该熟悉这些名称),很可能会更好地解决问题。

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

*foo = {};
*bar = \%foo;
$foo{x} = 3;
$bar{y} = 4;
请记住散列包含
(x=>3,y=>4)
:散列没有名字吗?名为‘foo’?名为“酒吧”?所有这些?以上都没有


你所能做的最好的事情就是用一个近似的答案。我建议不要在生产中使用它或类似的东西(即任何找到名称的东西)

你不能。sub无法知道散列的名称。散列没有名称,但指向它的变量有名称,请查看此帖子以了解如何访问变量名称。我认为这不是一个好主意。这是在Perl中可以做到的事情之一,但这并不意味着您永远都应该这么做。仅供参考:使用符号引用是一个巧妙的技巧,但通常被认为是一件坏事,除非有充分的理由,否则不应该在生产代码中使用。如果您不使用strict,这是可行的,我不建议您这样做。您可以使用
my_sub
内部的
no strict
来关闭
my_sub
内部的strict。变量是名称和存储之间的关联。“变量”是指关联。变量不是被关联的事物之一。修好了,很好,谢谢你的小费。我试图递归地使用子程序。我想我可以继续在子例程?@thomas.cloud中使用名称构建哈希-非常正确。如果你在这方面需要帮助,可以提出一个新问题,详细说明你想做什么:)
*foo = {};
*bar = \%foo;
$foo{x} = 3;
$bar{y} = 4;