在散列元素中取消引用列表引用

时间:2012-03-27 18:46:30

标签: perl

有人可以为我完成这个并解释你做了什么吗?

my %hash;

#$hash{list_ref}=[1,2,3];
#my @array=@{$hash{list_ref}};

$hash{list_ref}=\[1,2,3];
my @array=???

print "Two is $array[1]";

4 个答案:

答案 0 :(得分:6)

@array = @{${$hash{list_ref}}};

(1,2,3)是一个列表。

[1,2,3]是对列表数组的引用(从技术上讲,在Perl中没有这样的东西作为对列表的引用)。

\[1,2,3]是对数组引用的引用。

$hash{list_ref}是对数组引用的引用。

${$hash{list_ref}}是对数组的引用。

@{${$hash{list_ref}}}是一个数组。

由于引用被视为标量,因此对引用的引用是标量引用,标量解除引用运算符${...}用于中间步骤。

答案 1 :(得分:1)

其他人已经回答了这个问题,但更一般地说,如果您对数据结构感到困惑,请使用Data::Dumper。这将打印出神秘的数据blob的结构,并帮助您解析它。

use strict;     #Always, always, always
use warnings;   #Always, always, always
use feature qw(say);  #Nicer than 'print'

use Data::Dumper;     #Calling in the big guns!

my $data_something = \[1,2,3];

say Dumper $data_something;
say Dumper ${ $data_something };

让我们看看它打印出来的东西......

$ test.pl

$VAR1 = \[
            1,
            2,
            3
          ];

$VAR1 = [
          1,
          2,
          3
        ];

从第一个转储开始,$data_something似乎是对数组引用的纯标量引用。这导致我在第一次运行程序后添加第二个Dumper。这告诉我${ $data_something }现在是对数组的引用。

我现在可以像这样访问该数组:

use strict;     #Always, always, always
use warnings;   #Always, always, always
use feature qw(say);  #Nicer than 'print'

use Data::Dumper;     #Calling in the big guns!

my $data_something = \[1,2,3];

# Double dereference
my @array = @{ ${ $data_something } };  #Could be written as @$$data_something

for my $element (@array) {
    say "Element is $element";
}

现在......

$ test.pl
Element is 1
Element is 2
Element is 3

看起来你的意思是:

my $hash{list_ref} = [1,2,3];

而不是:

$hash{list_ref} = \[1,2,3];

后者给你一个数组引用的标量引用,除了给情况增加混乱外,它实际上对你没那么好。

然后,您需要做的就是引用特定元素$hash{list_ref}->[0]。这只是${ $hash{list_ref} }[0]的快捷方式。它更容易阅读和理解。

use strict;
use warnings;
use feature qw(say);

my %hash;
$hash{list_ref} = [1, 2, 3];

foreach my $element (0..2) {
    say "Element is " . $hash{list_ref}->[$element];
}

和...

$ test.pl
Element is 1
Element is 2
Element is 3

所以,下次你对特定数据结构的样子感到困惑(它发生在我们最好的人身上。好吧......不是我们最好的人,它发生在我身上) ,使用Data::Dumper

答案 2 :(得分:0)

my %hash;

#$hash{list_ref}=[1,2,3];

#Putting the list in square brackets makes it a reference so you don't need '\'
$hash{list_ref}=[1,2,3];

#If you want to use a '\' to make a reference it is done like this:
# $something = \(1,2,3); # A reference to a list
#
#   or (as I did above)... 
#
# $something = [1,2,3]; # Returns a list reference 
#
# They are the same (for all intent and purpose)


print "Two is $hash{list_ref}->[1]\n";


# To make it completely referenced do this:
#
# $hash = {}; 
# $hash->{list_ref} = [1,2,3];
#
# print $hash->{list_ref}[1] . "\n";

要获取数组(作为数组或列表),请执行以下操作:

my @array = @{ $hash{list_ref} }  

答案 3 :(得分:0)

[ EXPR ]

创建一个匿名数组,将EXPR返回的值赋给它,并返回对它的引用。这意味着它与

几乎相同
do { my @anon = ( EXPR ); \@anon }

这意味着

\[ EXPR ]

几乎相同
do { my @anon = ( EXPR ); \\@anon }

这不是人们通常看到的东西。


换句话说,

1,2,3返回三个元素的列表(在列表上下文中)。

(1,2,3)与之前相同。 Parens只会影响优先权。

[1,2,3]返回对包含三个元素的数组的引用。

\[1,2,3]返回对包含三个元素的数组的引用的引用。


在实践中:

my @data = (1,2,3);
print @data;

my $data = [1,2,3];      $hash{list_ref} = [1,2,3];
print @{ $data };        print @{ $hash{list_ref} };

my $data = \[1,2,3];     $hash{list_ref} = \[1,2,3];
print @{ ${ $data } };   print @{ ${ $hash{list_ref} } };