来自对象的HASH元素在单个字符串中返回

时间:2015-06-29 16:43:44

标签: perl function object hash module

我有一个带有函数getHash()的模块 Module.pm ,正如您所猜测的那样,返回数据的哈希))。我们都知道如何使用标准模型获取哈希的元素形式:

use Module;
my $m = new Module;
my %hash = $m->getHash();
print $hash{needed_element's_key};
一切都好。 但是如果你需要在单个字符串中编写两个最后一个字符串没有初始化一个新的HASH(并且只使用一个元素占用整个哈希的内存)会怎样?

有可能以某种方式这样做吗?比方说,$m->getHash()->{needed_element's_key}; 当然,给定的例子不起作用。 有什么建议? 谢谢!

2 个答案:

答案 0 :(得分:6)

无法返回哈希值。 Subs只能返回标量列表。您将该标量列表分配给现有哈希my %hash并获取该哈希的元素。

您可以通过使用匿名哈希来伪装您正在创建新哈希的事实:

my $val = { $m->getKeyValPairs() }->{$key};

或者,自定义过滤器可能更有效:

sub find_val {
   my $target_key = shift;
   while (@_) {
      my $key = shift;
      my $val = shift;
      return $val if $key eq $target_key;
   }

   return undef;
}

my $val = find_val $key, $m->getKeyValPairs();

但最好的选择是让方法返回对哈希的引用。然后,您不必执行创建哈希的浪费活动。您只需使用以下内容:

$m->getHashRef()->{$key}

答案 1 :(得分:5)

如果sub有return %hash,它实际上会返回一个键和值列表(交替)。您可以将其放回哈希并使用以下内容获取特定密钥:

print +{ $m->getHash() }->{needed_element_key};

(需要前导+以防止perl认为{是一个返回要打印到的文件句柄的块。)

但是你最好只返回一个哈希引用。