2013-03-04 2 views
0

Ниже приведен мой код (просто игра с хэшами), где я хочу создать хэш массива (ключи, назначаемые массиву). Но я получаю вывод как массив. Почему отображается эта ссылка на массив?Создайте хэш массива: Отображение ссылки на массив

#!/usr/bin/perl 
my @result = (0,0,0); 
my @operator = ('AP', 'MP', 'UP'); 
my %operator_res; 

for ($i = 0; $i <= $#operator; $i++) { 
    if ($i == 2) { 
     @result = (4,5,6); 
    } elsif ($i == 1) { 
     @result = (1,2,3); 
    } 
    @{$operator_res{$operator[$i]}} = @result; 
} 
foreach $keys (%operator_res) { 
    print "$keys:"; 
    #print "@{$operator_res{$keys}}\n"; 
    print "$operator_res{$keys}[0], $operator_res{$keys}[1], $operator_res{$keys}[2]\n"; 
} 

Выход

UP:4, 5, 6 
ARRAY(0x17212e70):, , Why is this array reference printing? 
AP:0, 0, 0 
ARRAY(0x17212e00):, , 
MP:1, 2, 3 
ARRAY(0x17212e20):, , 
+1

'print join (", ", @ {$ operator_res {$ keys}})," \ n ";' лучше, чем печатать все ваши элементы массива. – TLP

+0

Спасибо, TLP. – sach

ответ

4
foreach $keys (%operator_res) 

должен быть

foreach $keys (keys %operator_res) 
+1

+1 Это было очень трудно обнаружить ошибку. Некоторые вещи, которые вы считаете само собой разумеющимся в коде других людей. – TLP

0

Значение хэш в Perl должен быть скаляром. Чтобы имитировать многомерные хэши, используйте значения ссылок на хеши или массивы.

Линия

@{$operator_res{$operator[$i]}} = @result; 

в вашем вопросе эквивалентно

$operator_res{ $operator[$i] } = [ @result ]; 

То есть, значение, связанное с ключом $operator[$i] в то время является ссылка в новый массив, содержимое которого те же, что и у @result.

Для многих примеров читайте perllol documentation.

+0

Привет, Грег Бэкон, если вы передадите ссылку массиву на perl, то% operator_res будет иметь одинаковые значения для всех ключей. Я хочу сохранить @result в хеше для соответствующего ключа. – sach

+1

Но код Грега не принимает ссылки на '@ result', не так ли? Он использует конструктор анонимного массива ('[...]') для создания копии '@ result' и использует ссылку на эту новую копию. –

+0

@sach Если бы код был '$ operator_res {$ operator [$ i]} = \ @result;' вы были бы правы. Вместо этого '[@result]' создает ** новый массив **, содержимое которого является (неглубокой) копией '@ result' и дает ссылку на новый массив. –

0

Вы можете использовать Data :: Dumper для распечатки данных в хорошо отформатированный образом:

use Data::Dumper; 
print Dumper(\%operator_res); 

Q: Почему это массив ссылка печать?

A: Из-за этой строки: напечатать «$ keys:»;

1

Ваш цикл foreach выполняет итерации по каждому элементу %operator_res, а не только по клавишам. Как уже сказал икагим, вы должны использовать keys, чтобы получить только ключи хеша.

Если вы посмотрите с Data::Dumper на %operator_res Выхода является:

$VAR1 = 'UP'; 
$VAR2 = [ 
      4, 
      5, 
      6 
     ]; 
$VAR3 = 'AP'; 
$VAR4 = [ 
      0, 
      0, 
      0 
     ]; 
$VAR5 = 'MP'; 
$VAR6 = [ 
      1, 
      2, 
      3 
     ]; 

Как вы видите, вы всегда получите две итерации для каждого элемента: один для ключа и один для исх массива.

Смежные вопросы