2013-06-18 2 views
0

Если у меня есть что-то вроде этого:Как ссылаться на хэш в Perl?

%hash = {foo => 'bar', foo1=>'bar1',}; 

или

%hash = (foo => 'bar', foo1=>'bar1',); 

или

$hash = {foo => 'bar', foo1=>'bar1',}; 

или

$hash = (foo => 'bar', foo1=>'bar1',); 

Как вышеуказанные коды отличаются? и как мне получить доступ к их компонентам?

+0

'использовать строгие; использовать предупреждения; ' – friedo

ответ

9

(...) сортирует приоритет, а {...} создает хеш ссылка.

%hash = {foo => 'bar', foo1=>'bar1',}; 

Присвоение %hash одного значения. Однако хешам присваивается список пар ключ-значение с четным размером. Ваш код будет использовать строчку hashref в качестве ключа (HASH(0x123ABC)) и undef как значение. Пожалуйста, use warnings, чтобы сообщить вам, когда вы назначаете нестандартный список хеш-переменной.

%hash = (foo => 'bar', foo1=>'bar1',); 

правильный. Список RHS оценивается в контексте списка и присваивается переменной хеширования. Вы можете получить доступ к таким записям, как $hash{foo}.

$hash = {foo => 'bar', foo1=>'bar1',}; 

является правильным. Хеш-ссылку присваивается скалярной переменной. Вы можете получить доступ к элементам, таким как $hash->{foo}. Обратите внимание на стрелку разыменования , которая необходима для устранения необходимости доступа к хэш-доступу с помощью hashref (у вас могут быть переменные с именами как %hash, так и $hash в той же области).

$hash = (foo => 'bar', foo1=>'bar1',); 

оценивает список на РИТ в скалярном контексте, и присвоит последнее значение . Таким образом, $hash = "bar1" - это то же самое.

+0

Я знаю, что это всего лишь примеры, но удалите последнюю запятую внутри скобок, некоторые новички попытаются запустить этот код и закончить с ошибками. :) –

+1

@HarryBarry Я понимаю ваши проблемы, но даже с конечными запятыми все примеры синтаксически действительны и работают «правильно». Я не хотел менять форматирование из вопроса, когда это не было необходимо. – amon

+0

@HarryBarry, он работает. Попробуй. На самом деле он выглядит симпатичным/симметричным, когда вы пишете хэш на нескольких строках. – doubleDown

3
  1. Назначает хеш-ссылку на хэш. Это не имеет смысла.
  2. Назначает список хэшу. Так вы обычно обрабатываете хеши.
  3. Назначает хеш-ссылку на скаляр. Так вы обычно обрабатываете хеш-ссылки.
  4. Назначает список скаляру. В результате вы получите последнее значение.

Чтобы оценить скалярное значение в хэш (2):

$hash{'foo'} 

Чтобы получить доступ к скалярное значение в hashref (3):

$hash->{'foo'} 

См perldoc perlref for more about references

3

Вы хотите

my %hash = (key1 => 'value1', key2 => 'value2'); # Hash 

или

my $hash = { key1 => 'value1', key2 => 'value2' }; # Reference to hash 

Когда один задает список на хэш, он рассматривается как список пар ключ-значение, поэтому правильный способ инициализация хеша составляет

my %hash = (key1 => 'value1', key2 => 'value2'); 

{ ... } 

похож на

do { my %anon = (...); \%anon } 

Это создает анонимный хеш и возвращает ссылку на него. Единый справочник не является список пар ключ-значение, так что следующее не имеет смысла:

my %hash = { ... }; # XXX 

Если вы действительно хотели сохранить ссылку на хэш, вы бы хранить его в скаляр.

my $hash = { ... }; # ok 

Так что же следующее делать?

my $hash = (a => 'b', c => 'd'); 

Ну

a => 'b', c => 'd' 

просто причудливый способ написания

'a', 'b', 'c', 'd' 

И поскольку мы присваиваем в скаляр, то правая часть оператора присваивания оценивается в скалярном контексте. Список буквальный (например 'a', 'b', 'c', 'd') в скалярном контексте оценивает в своем последнем пункте, таким образом

my $hash = (a => 'b', c => 'd'); 

означает

my $hash = 'd'; 
Смежные вопросы