有人可以为我完成这个并解释你做了什么吗?
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]";
答案 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} } };