我有一个模块module.pm,函数为getHash()
,如您所料,它返回一个数据散列)。我们都知道如何使用标准模型从散列中获得元素
use Module;
my $m = new Module;
my %hash = $m->getHash();
print $hash{needed_element's_key};
一切都好。但是,如果您需要在一个字符串中写入最后两个字符串而不初始化一个新的HASH(并占用整个哈希的内存,只使用一个元素),该怎么办?
有可能以某种方式这样做吗?比如$m->getHash()->{needed_element's_key};
当然,给定的例子不起作用。有什么建议吗?谢谢
不可能返回哈希。子只能返回标量列表。您将标量列表分配给现有的散列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}
如果子执行return %hash
,它实际上会返回键和值的列表(交替)。您可以将其放回哈希中,并使用获取特定密钥
print +{ $m->getHash() }->{needed_element_key};
(需要前导+
来防止perl认为{
是一个返回要打印的文件句柄的块。)
但您最好只返回一个散列引用。