2012-06-15 35 views
2

我搜索的SO问这个问题之前,我完全新的这一点,不知道如何处理这些错误。我的意思是Perl语言。哈希作为参考被弃用

当我把这个

%name->{@id[$#id]} = $temp; 

我得到的错误Using a hash as a reference is deprecated

我试图

$name{@id[$#id]} = $temp 

,但不能得到任何结果回来。

有什么建议吗?

+0

什么样的变量是“名称”?它在哪里首先被初始化,它包含什么样的数据?如果不知道,不能帮助你。虽然,我会说 - >是解引用操作符,它只适用于包含引用的$标量,而不是%哈希,因此也是错误。 –

+0

我通过执行'my%name;'初始化它在代码的顶部# – Grigor

+0

@Grigor尝试'$ name {$ id [$#id]} = $ temp' – starbolin

回答

8

访问散列%name的元件正确的方法是$name{'key'}。语法%name->{'key'}在Perl v5.6中有效,但此后不推荐使用。

同样,要访问数组@id的最后一个元素,您应该编写$id[$#id]或更简单地说,$id[-1]

您的第二个版本应该可以正常工作,而您无法检索该值具有不相关的原因。

$name{$id[-1]} = 'test'; 

print $name{$id[-1]}; 

将显示test正确

-2

如果你想从一个数组或哈希使用$一个项目。有关项目列表,请分别使用@和%。你使用@作为引用返回一个列表,而不是perl可能被解释为散列的项目。

此代码演示了您对数组散列的引用。

#!/usr/bin perl -w 
my %these = ('first'=>101, 
      'second'=>102, 
      ); 
my @those = qw(first second); 
print $these{$those[$#those]}; 

打印 '102'

+0

这是错误的。你不能使用'%'从任何东西中提取列表。 Perl永远不会将列表解释为哈希。 – Borodin

+0

@Borodin我们可能会争论symantics,但是'perl -e'%these = qw(foo 0 bar 1); print join(“:”,%these)''在两个方面都可以正常工作。 – starbolin

+0

@Borodin Perl显然没有将列表解释为散列,因为它通过一个错误。 – starbolin

4
%name->{...} 

一向车。它没有做它应该做的事情。因此,它现在会在您尝试使用它时发出警告。正确的方法来索引哈希

$name{...} 

因为你已经相信了。


现在,你说

$name{@id[$#id]} 

不起作用,但即便如此,这是因为一个错误的代码别的地方的。该代码最肯定的作品

>perl -wE"@id = qw(a b c); %name = (a=>3, b=>4, c=>5); say $name{@id[$#id]};" 
Scalar value @id[$#id] better written as $id[$#id] at -e line 1. 
5 

正如警告说,虽然适当的方式来索引数组不

@id[...] 

它实际上

$id[...] 

最后,获取数组的最后一个元素的最简单方法是使用索引-1。这意味着你的代码应该是

$name{ $id[-1] } 
-1

最流行的答案是只是不取消引用,但这是不正确的。换言之,%$hash_ref->{$key}%$hash_ref{$key}不可互换。前者需要访问嵌套为另一个散列引用中元素的散列引用。

对于很多卫星来说,它已经是嵌套哈希引用的常见位置。事实上,有几个模块解析数据并将其存储在这种数据结构中。立即贬低没有模块更新的行为并不是一件好事。有时我的数据被困在一个嵌套的散列中,唯一的办法就是做类似的事情。

$new_hash_ref = $target_hash_ref->{$key1} 
$new_hash_ref2 = $target_hash_ref->{$key2} 
$new_hash_ref3 = $target_hash_ref->{$key3} 

,因为我不能

foreach my $i(keys(%$target_hash_ref)) { 
    foreach(%$target_hash_ref->{$i} { 
     #do stuff with $_ 
    } 
} 

了。

是的,上面有点奇怪,但为了避免以某种方式访问​​数据结构而创建新的变量更糟糕。我错过了什么吗?