среда, 31 марта 2010 г.

Тест на понимание Perl: Вопрос 2

@a = (2,3,4,5); my $a = {a=>"q", b=>@a, c=>2}; print $a->{c}; Ответ: undef
Пояснение: хеш представляет собой список с пар(ключ/значение). значение(как и ключ) всегда представляет собой скаляр.  Оператор => - по своей сути, это синоним оператору ",", только он еще берет левый аргумент в двойные кавычки. 



Эта запись {a=>"q", b=>@a, c=>2} на самом деле
равна  {"a", "q", "b" , @a, "c", 2}, 
либо  {"a", "q", "b" , 2, 3, 4, 5, "c", 2} 
либо
{a => "q", b =>  2, 3 => 4, 5 => "c", 2 }  и можем видеть, что ключа "c" просто нет в хеше.

Если мы хотим, обращаться по ключу к массиву, то мы должны указать в качестве значения ссылку на масив, а не масив как список.
my $a = {a=>"q", b=>\@a, c=>2}.

5 коммент.:

Анонимный комментирует...

perl -lwe ' @a = (2,3,4,5); my $a = {a=>"q", b=>@a, c=>2}; print $a->{c};'
Odd number of elements in anonymous hash at -e line 1.
Use of uninitialized value in print at -e line 1.

1 Варнинг сразу наводит на размышления.

m_ivanov комментирует...

Ммм... Не уловил морали.

Так и должно быть, по определению. Это не какой-то особый/интересный случай. Сказано же в документации - значением хеша должен быть скаляр. Вот и надо указывать скаляр, а не массив.

m_ivanov комментирует...

А! Прочитав "первый вопрос" понял, что в этом и суть - разбор "тонкостей" перла.

Антон комментирует...

Чисто методологически пример интересный, на самом деле perl это не только "use strict;" и "use warnings;"

Хотя никто из профессиональных разработчиков так писать не будет, и первый комментарий тому подтверждение.

koorchik комментирует...

По поводу писать так никто не будет, то я встречал такой код в реальном проекте :).

А про варнинги, то можно написать и другой пример
без варнингов: perl -lwe ' @a = ("a".."c"); my $a = {a=>"q", b=>2, c=>@a}; print $a->{b};'

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)