2016-04-26 2 views
3

В чем разница между %{$var} и %$var? Я попробовал этот код, но есть ошибка:

each on reference is experimental at test.pl line 21. Type of argument to each on reference must be unblessed hashref or arrayref at test.pl line 21.

use feature 'say'; 

%HoH = (
    1 => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    2 => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", 
    }, 
    3 => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
    }, 
); 

for ($i = 1; $i <= 3; $i++) { 
    while (($family, $roles) = each %$HoH{$i}) { 
     say "$family: $roles"; 
    } 
} 

Но этот код работает отлично:

use feature 'say'; 

%HoH = (
    1 => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    2 => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", 
    }, 
    3 => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
    }, 
); 

for ($i = 1; $i <= 3; $i++) { 
    while (($family, $roles) = each %{$HoH{$i}}) { 
     say "$family: $roles"; 
    } 
} 
+0

Возможный дубликат [В чем разница между $ {var}, "$ var" и "$ {var}" в оболочке Bash?] (Http://stackoverflow.com/questions/18135451/what- is-the-difference-between-var-var-and-var-in-the-bash-shell) – Emna

+2

@Emna: язык OP * Perl * ... – MarcoS

+3

Используйте 'use strict' для вашего кода. – eballes

ответ

7

С %$HoH{$i} вы делаете хэш ссылки на $ НОН, в то время как с %{$HoH{$i}} вы делаете ссылку на хеш из $HoH{$i}, что вам нужно ... И, use strict по вашему коду :-)

+0

Да, я обычно использую строгий код. Это просто для целей тестирования. : D. Спасибо за Ваш ответ. :) – stenlytw

+2

@bounces, даже при тестировании вы должны его использовать! Ошибка при использовании строгого в вашем источнике совсем другая: «Глобальный символ» $ HoH «требует явного имени пакета», и это дало бы вам ответ на ваш вопрос. – eballes

+0

@eballes Но до сих пор существует ошибка: «каждый по ссылке - экспериментальный» с использованием строгой. – stenlytw

2

Его из-за разных уровней приоритета res олицетворяя хеш и подписывая хэш. Он работает со второй версией - %{ $HoH{$i} } - потому что вы недвусмысленно заявляете, что значение, возвращаемое поиском $HoH{$i}, само по себе является hashref.

Принимая во внимание, что %$HoH{$i} понимается как %{ $HoH }{$i} - т.е. подписка происходит после того, как выражение $HoH интерпретируется как hashref - а это не так. %HoH - хеш, но $HoH не используется - т. Е. Он не определен.

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