| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Ссылка на массив |
| Автор: burakov 4.5.2011, 11:27 | ||||
по идее должно напечатать 0, а пишет не могу использовать undefined value as an ARRAY вопрос вот в чем, часто использую ссылки для передачи из попрограммы - как то удобно это А в результате непонятного вот такого поведения ссылки на массив, пришлось, сначала с массивом поработать, а затем через foreach запихать его в ссылку , может есть более простой синтаксис??? передачи массива по ссылке?
Спасибо. |
| Автор: arto 4.5.2011, 11:46 |
| # perl -le 'my $ref = []; print scalar @$ref' 0 # |
| Автор: burakov 4.5.2011, 12:37 |
| А почему не работает в моем варианте (с круглыми скобками)? Кто поможет расшифровать? чего я такое написал? |
| Автор: Pfailed 4.5.2011, 13:15 | ||||||
Присваиваете скаляру список. При этом в скаляр ($ref) заносится последний элемент списка. undef в данном случае, т.к список пустой.
Посмотрите что даёт этот код, станет понятно. Достаточно было
|
| Автор: burakov 4.5.2011, 15:03 |
| Блин, сколько всего написал уже Всегда думал что $ref = () это ссылка на безымянный массив. И главное что все всегда работало - этот косяк который обнаружил с undef перый за 5 лет $ref = {} а если так, то ссылка на безымянный хеш. а как тогда указать - на что ссылка? Или как ссылку разименуешь, так perl и будет ее обрабатывать? |
| Автор: Pfailed 4.5.2011, 15:33 |
| За 5 лет можно было бы уже и какую-нибудь умную книжку прочитать. [] - ссылка на анонимный массив {} - ссылка на анонимный хеш () - список @a - массив \@a - ссылка на массив %a - хеш \%a - ссылка на хеш |
| Автор: SkoobyDoo 4.5.2011, 15:45 | ||
Если надо узнать, какая структура данных скрывается за ссылкой, можно воспользоваться функцией ref
|
| Автор: burakov 4.5.2011, 15:58 | ||
| Так вроде ж где то и прочитал то ... что $ref = () - я ж не сам такое выдумал. Спасибо за ответы, но все равно непонятно - чем допустим массив от списка (в perl) отличается - ведь у него массивы то и есть списки то есть $ref = (); по идее тоже самое что и $ref = [] Код вот ниже вполне рабочий
|
| Автор: Pfailed 4.5.2011, 16:50 |
| Список - неизменчивая последовательность Массив - напротив Например в perldoc: map BLOCK LIST shift ARRAY Видно, что у map вторым аргументом может быть любая последовательность, а у shift аргументом может быть только массив, т.к. shift изменяет свой аргумент. Подробнее можно найти в сети. https://www.socialtext.net/perl5/array_vs_list В вашем примере my $ref_array = () эквивалентно my $ref_array = undef. Уже писал почему. Затем происходит автооживление: http://en.wikipedia.org/wiki/Autovivification |