@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}.
среда, 31 марта 2010 г.
Подписаться на:
Комментарии к сообщению (Atom)
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 Варнинг сразу наводит на размышления.
Ммм... Не уловил морали.
Так и должно быть, по определению. Это не какой-то особый/интересный случай. Сказано же в документации - значением хеша должен быть скаляр. Вот и надо указывать скаляр, а не массив.
А! Прочитав "первый вопрос" понял, что в этом и суть - разбор "тонкостей" перла.
Чисто методологически пример интересный, на самом деле perl это не только "use strict;" и "use warnings;"
Хотя никто из профессиональных разработчиков так писать не будет, и первый комментарий тому подтверждение.
По поводу писать так никто не будет, то я встречал такой код в реальном проекте :).
А про варнинги, то можно написать и другой пример
без варнингов: perl -lwe ' @a = ("a".."c"); my $a = {a=>"q", b=>2, c=>@a}; print $a->{b};'
Отправить комментарий
Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)