2

在问这个问题之前我搜索了 SO,我对此完全陌生,不知道如何处理这些错误。我的意思是 Perl 语言。

当我把这个

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

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

我试过

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

但无法得到任何结果。

有什么建议么?

4

4 回答 4

8

访问哈希元素的正确方法%name$name{'key'}. 该语法%name->{'key'}在 Perl v5.6 中有效,但已被弃用。

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

您的第二个变体应该可以正常工作,并且您无法检索该值有一个不相关的原因。

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

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

test正确显示

于 2012-06-15T04:02:10.823 回答
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[...]

最后,获取数组最后一个元素的最简单方法是使用 index -1。你的代码应该是

$name{ $id[-1] }
于 2012-06-15T04:26:40.403 回答
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 $_
    }
}

了。

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

于 2014-06-16T21:17:57.520 回答
-2

如果您想要数组或哈希中的一项,请使用 $。对于项目列表,分别使用 @ 和 %。您使用 @ 作为引用返回了一个列表,而不是 perl 可能解释为哈希的项目。

此代码演示了您对数组哈希的引用。

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

打印“102”

于 2012-06-15T04:16:59.360 回答