Другие в значительной степени уже ответили на вопрос, но в более общем плане, если вы когда-либо не понимаете структуру данных, используйте Data :: Dumper .Это распечатает структуру таинственного сгустка данных и поможет вам разобрать его.
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
.