Ошибка Perl "Не ссылка на массив" - PullRequest
3 голосов
/ 17 августа 2011

Я буду рад, если кто-нибудь сможет просветить меня относительно моей ошибки:

my %mymap; 
@mymap{"balloon"} = {1,2,3};

print $mymap{"balloon"}[0] . "\n";

Ответы [ 4 ]

6 голосов
/ 17 августа 2011

$mymap{'balloon'} - это хеш , а не массив .Выражение {1,2,3} создает хэш:

 {
   '1' => 2,
   '3' => undef
 }

Вы присвоили его слайсу из %mymap, соответствующему списку ключей: ('balloon'),Поскольку ключ list был 1 элементом, а значение list было одним элементом, вы сделали то же самое, что и

$mymap{'balloon'} = { 1 => 2, 3 => undef };

Если вы использовали strict иwarnings это бы подсказало вам вашу ошибку.Я получил:

Scalar value @mymap{"balloon"} better written as $mymap{"balloon"} at - line 3. Odd number of elements in anonymous hash at - line 3.

4 голосов
/ 17 августа 2011

Если вы использовали 'используйте строгий;используйте предупреждения;в верхней части вашего кода у вас, вероятно, были лучшие сообщения об ошибках.

Что вы делаете, это создаете хеш с именем mymap .Хеш хранит данные в виде пар ключ => значение.Затем вы назначаете ссылку на массив ключу balloon .В вашем небольшом фрагменте кода было две проблемы: 1. вы не обращались к хэшу mymap, 2. если вы хотите передать список, вы должны использовать квадратные скобки:

my %mymap;
$mymap{"balloon"} = [1,2,3];
print $mymap{"balloon"}[0] . "\n";

это печатает '1'.

Вы также можете просто использовать массив:

my @balloon = (1,2,3);
print $balloon[0] . "\n";
3 голосов
/ 17 августа 2011

Ну, во-первых, всегда use strict; use warnings;. Если бы вы имели, он мог бы рассказать вам о том, что здесь не так.

Вот что вы делаете в своей программе:

my %mymap;  # declare hash %mymap
@mymap{"balloon"} = {1,2,3};  # attempt to use a hash key on an undeclared 
                              # array slice and assign an anonymous hash to it

print $mymap{"balloon"}[0] . "\n";  # print the first element of a scalar hash value

Чтобы сделать то, что вы ожидаете, сделайте:

my %mymap = ( 'balloon' => [ 1,2,3 ] );
print $mymap{'balloon'}[0];
1 голос
/ 17 августа 2011

Хорошо, несколько вещей ...

%mymap - это хеш.$mymap{"balloon"} - это скаляр, а именно значение хеша %mymap, соответствующее ключу "balloon".@mymap{"balloon"} - это попытка того, что называется ломтиком хеша - в основном, вы можете использовать их для одновременного присвоения набора значений группе ключей: @hash{@keys}=@values.

Итак, если вы хотитеприсвоить ссылку на массив $mymap{"balloon"}, вам понадобится что-то вроде:

$mymap{"balloon"}=[1,2,3].

Для доступа к элементам вы можете использовать ->, например, так:

$mymap{"balloon"}->[0] #equals 1
$mymap{"balloon"}->[1] #equals 2
$mymap{"balloon"}->[2] #equals 3

Или вы можете опустить стрелки: $mymap{"balloon"}[0] и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...