我搜索的SO问这个问题之前,我完全新的这一点,不知道如何处理这些错误。我的意思是Perl语言。哈希作为参考被弃用
当我把这个
%name->{@id[$#id]} = $temp;
我得到的错误Using a hash as a reference is deprecated
我试图
$name{@id[$#id]} = $temp
,但不能得到任何结果回来。
有什么建议吗?
我搜索的SO问这个问题之前,我完全新的这一点,不知道如何处理这些错误。我的意思是Perl语言。哈希作为参考被弃用
当我把这个
%name->{@id[$#id]} = $temp;
我得到的错误Using a hash as a reference is deprecated
我试图
$name{@id[$#id]} = $temp
,但不能得到任何结果回来。
有什么建议吗?
访问散列%name
的元件正确的方法是$name{'key'}
。语法%name->{'key'}
在Perl v5.6中有效,但此后不推荐使用。
同样,要访问数组@id
的最后一个元素,您应该编写$id[$#id]
或更简单地说,$id[-1]
。
您的第二个版本应该可以正常工作,而您无法检索该值具有不相关的原因。
写
$name{$id[-1]} = 'test';
和
print $name{$id[-1]};
将显示test
正确
如果你想从一个数组或哈希使用$一个项目。有关项目列表,请分别使用@和%。你使用@作为引用返回一个列表,而不是perl可能被解释为散列的项目。
此代码演示了您对数组散列的引用。
#!/usr/bin perl -w
my %these = ('first'=>101,
'second'=>102,
);
my @those = qw(first second);
print $these{$those[$#those]};
打印 '102'
%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] }
最流行的答案是只是不取消引用,但这是不正确的。换言之,%$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 $_
}
}
了。
是的,上面有点奇怪,但为了避免以某种方式访问数据结构而创建新的变量更糟糕。我错过了什么吗?
什么样的变量是“名称”?它在哪里首先被初始化,它包含什么样的数据?如果不知道,不能帮助你。虽然,我会说 - >是解引用操作符,它只适用于包含引用的$标量,而不是%哈希,因此也是错误。 –
我通过执行'my%name;'初始化它在代码的顶部# – Grigor
@Grigor尝试'$ name {$ id [$#id]} = $ temp' – starbolin