如何取消引用哈希引用

时间:2014-03-28 16:39:10

标签: perl hash dereference

更新:我所知道的关于引用/解除引用的一切都来自这里:http://www.thegeekstuff.com/2010/06/perl-array-reference-examples/

我正在使用一个库(来自库文档):

Returns a reference to an array of hash references

这在概念上对我有意义(我不是编程的新手),但在功能上没有意义(我显然对perl来说很新)。

以下是一些代码:

my $Obj  = QA::STK::ModuleImUsing->new(arguments, to, new);
$Obj->createClient();
$Obj->sync( ['/tmp/files/...']);
my $result = $Obj->method_in_question(['/tmp/files/ff-latest.xml']);

到目前为止一切顺利。 $result现在保存对数组的引用。

所以当我这样做时:

print "Result: @{ $result} \n";

我明白了:

Result: HASH(0x20d95b0)

可爱!但是我仍然需要取消引用哈希。然而,这里的事情变得奇怪(或者他们已经变得奇怪了?)。

my $hash_ref = @{ $result};
print Dump($hash_ref));

我明白了:

$VAR1 = 1;

哪个...不是我期待的。

我的期望是错误还是我以错误的方式取消引用?

3 个答案:

答案 0 :(得分:5)

如果@$result是一个数组,那么您的LHS必须是一个列表。否则将为$hashref分配数组大小。

my ($hash_ref) = @{ $result};
print Dump($hash_ref));

答案 1 :(得分:3)

  • 我们有%hash
  • 为此,我们有一个哈希引用$hashref = \%hash
  • 此hashref位于数组@array = ($hashref)
  • 我们得到一个数组引用:$arrayref = \@array

这是我们的结果:$result = $arrayref。不要让它倒退:

  • @result_array = @$result
  • $result_hashref = $result_array[0]或合并:$result_hashref = $result->[0]
  • %result_hash = %$result_hashref或合并:%result_hash = %{ $result->[0] }(请注意,这些会复制)
  • 要在结果哈希中获取元素,我们可以这样做
    • $result_hash{$key}
    • $result_hashref->{$key}
    • $result->[0]{$key}

请注意,$scalar = @{ $arrayref }无法正常工作,因为数组(@{ … }是)在标量上下文中返回数组的 length 。要在分配中强制列表上下文,请将左侧放入parens:(…) = here_is_list_context(其中是零个或多个左值的列表)。

答案 2 :(得分:1)

my $hash_ref = @{$result};

相同
my @array = @{$result};
my $hash_ref = @array;

这会强制数组在标量上下文中由赋值运算符计算,这会使其计算为数组中的项数,或者为1。