【问题标题】:How do I print a hash name in Perl?如何在 Perl 中打印哈希名称?
【发布时间】:2012-08-10 17:53:38
【问题描述】:

有点简单的问题,但它让我很难过,谷歌只是让我误入歧途。我要做的就是打印出哈希的名称。例如:

&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);

}

我不知道的部分是如何获取括号中的内容(插入...)。对于嵌套散列,您可以使用“键”标签来获取散列名称(如果您想这样称呼它们)。我不知道如何获取整个哈希名称,它似乎真的只是另一个键。

【问题讨论】:

  • 你不能。 sub 不知道哈希的名称。
  • 哈希没有名字,但指向它的变量有,查看这篇文章了解如何访问变量名stackoverflow.com/questions/5199860/…
  • 我认为这不是一个好主意。这是在 Perl 中可以做到的事情之一,但这并不意味着你应该这样做。

标签: perl


【解决方案1】:

正如@hackattack 在评论中所说,您的问题的技术答案可以在Get variable name as string in Perl 的答案中找到

但是,你应该考虑你是否做对了?

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

【讨论】:

  • 很好,谢谢你的提示。我试图递归地使用子程序。我想我可以继续在子例程中使用名称构建哈希?
  • @thomas.cloud - 非常正确。如果您需要这方面的帮助,请提出一个新问题,详细说明您正在尝试做的事情:)
【解决方案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};

}

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      如果你想打印变量的名字,那不是很简单(见 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);),尽管这是完全不同的事情。

      【讨论】:

      • 仅供参考:使用符号引用是一个巧妙的技巧,但通常被认为是一件坏事,除非有充分的理由,否则不应在生产代码中使用。
      • 如果您不使用use strict,则此方法有效,我不建议您这样做。您可以使用 no strict inside of my_sub 作为折衷方案关闭 my_sub 的严格内部。
      • 变量是名称和存储之间的关联。 “变量”是指关联。变量不是关联的事物之一。固定。
      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 2017-09-30
      • 2016-12-18
      • 2011-01-26
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多