我在问这个问题之前搜索了SO,我对此完全陌生,并且不知道如何处理这些错误。我的意思是Perl语言。
当我把这个
%name->{@id[$#id]} = $temp;
我收到错误Using a hash as a reference is deprecated
我试过
$name{@id[$#id]} = $temp
但无法取得任何结果。
有什么建议吗?
答案 0 :(得分:8)
访问哈希%name
元素的正确方法是$name{'key'}
。语法%name->{'key'}
在Perl v5.6中有效,但后来被弃用。
同样,要访问数组@id
的最后一个元素,您应该写$id[$#id]
,或者更简单地写$id[-1]
。
您的第二个变体应该可以正常工作,而且您无法检索该值有一个无关的原因。
写
$name{$id[-1]} = 'test';
和
print $name{$id[-1]};
将正确显示test
答案 1 :(得分: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] }
答案 2 :(得分:0)
流行的答案是不要取消引用,但这不正确。换句话说,%$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 $_
}
}
了。
是的,上面有点奇怪,但创建新变量只是为了避免以某种方式访问数据结构更糟糕。我错过了什么吗?
答案 3 :(得分:-2)
如果你想要数组或散列中的一个项目使用$。对于项目列表,分别使用@和%。您使用@作为引用返回了一个列表,而不是perl可能被解释为哈希的项。
此代码演示了您对数组哈希的引用。
#!/usr/bin perl -w
my %these = ( 'first'=>101,
'second'=>102,
);
my @those = qw( first second );
print $these{$those[$#those]};
打印'102'