Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Bulat Ziganshin                      2:5093/28.126  15 Mar 2002  20:58:12
 To : All
 Subject : perldsc - краткое изложение
 -------------------------------------------------------------------------------- 
 
 
 ну очень краткое :)  итак, как работать в perl с вложенными массивами и хешами
 
 до perl5 в перле было всего три (основных) типа данных и имя переменной
 полностью определяло, данные какого типа она хранит
 
 $x - хранит ЗАЧЕИЕ (число или строку)
 @x - хранит список ЗАЧЕИЙ
 %x - хранит список пар строка->ЗАЧЕИЕ
 
 в perl5 всё осталось также, только понятие ЗАЧЕИЯ было расширено - теперь это
 может быть ССЫЛКА на массив или хеш. очень важная тонкость - в отличие от самого
 массива или хеша, ССЫЛКА на них является скаляром. вот смотрите:
 
 @a = (1,2);
 $a = [ (1,2) ];  # квадратные скобки превращают массив/хеш в ССЫЛКУ на массив
 %b = (1=>2);
 $b = { (1=>2) }; # фигурные скобки превращают массив/хеш в ССЫЛКУ на хеш
 
 обратите внимания - круглые скобки используются только для группировки, а
 квадратные и фигурные являются ОПЕРАТОРОМ, превращающим СОСТАВHОЕ ЗАЧЕИЕ в
 ССЫЛКУ. Внутри []/{} круглые скобки обычно опускают, я привёл их лишь для
 удобства понимания единственной существенной разницы между этими действиями
 
 теперь несложно сконструировать массив массивов:
 @c = ( [1,2], [2], [3,4,5] );
 
 на самом деле, конечно, это массив ССЫЛОК на массивы. но к его элементам можно
 обращаться, не задумываясь об этом - $c[0][1]
 
 или создадим хеш хешей:
 %d = ( C=> {Speed=>Good, Readability=>Bad}, Perl=>{Speed=>hmmm} );
 
 опять же, $d{Perl}{Speed} будет работать
 если же вы и внешние круглые скобки замените на []/{}, то опять получите скаляр,
 и его надо будет присваивать тоже скаляру:
 
 $e = [ [1,2], [3,4] ];  # ССЫЛКА на массив, состоящий из ССЫЛОК на массивы
 
 поскольку перловые функции обычно ожидают "развёрнутый" массив/хеш, пользоваться
 таким скаляром будет неудобно. да и к элементам его доступ неочевиден -
 $e->[0][1]. собственно, "->" - оператор разыменования ССЫЛОК, и для доступа к
 элементам @c он тоже используется, но перл вставляет его неявно:
 $c[0][1] эквивалентно $c[0]->[1]. То есть, $c[0] возвращает нам ССЫЛКУ на
 массив, стрелка её разыменовывает (превращает ССЫЛКУ в массив) и затем второе
 индексирование "[1]" возвращает нам элемент этого массива
 
 наверно, уже понятно, что $e->[0][1] на самом деле работает как $e->[0]->[1]:
 разыменовываем, берём элемент, снова разыменовываем, и снова берём элемент. с
 массивами хешей, и со сколь угодно более сложными структурами данных всё точно
 также. разумеется, их можно произвольно смешивать:
 
 $a = [ 1, [2,3], {a=>b}, [[4,5]] ];
 1 == $a->[0]
 2 == $a->[1][0]
 b == $a->[2]->{a} == $a->[2]{a}
 5 == $a->[3][0][1]
 вот, в общем-то, и всё. добавлю несколько дополнительных замечаний
 
 операторы []/{} создают КОПИИ переданных им ЗАЧЕИЙ. если вы хотите вместо этого 
 получить ССЫЛКУ на ТЕ ЖЕ данные, используйте оператор "\". кстати, эти операторы
 можно комбинировать:
 
 @a = (1,2);
 @b = (3,4);
 @c = ( [@a], [@b] );  # @c содержит (ССЫЛКИ на) копии массивов a и b
 @d = ( \@a, \@b );    # @d содержит ССЫЛКИ на массивы a и b
 @e = ( [\@a, \@b], [[@a], [@b]] );
 @e - трёхмерный массив,
 $e[0][0][$i] эквивалентно $a[$i]
 $e[0][1][$i] эквивалентно $b[$i]
 $e[1][0][$i] содержат копии $a[$i]
 $e[1][1][$i] содержат копии $b[$i]
 
 т.е. теперь присваивания $a[$i] изменят также ЗАЧЕИЯ $d[0][$i] и $e[0][0][$i] и 
 наоборот. ссылки полезны при передаче сложных структур данных в функции (чтоб
 перл не разворачивал всё в один бессмысленный список) и при манипуляциях со
 связными структурами данных, типа деревьев и связных списков
 
 не используйте операцию получения ссылки без необходимости, поскольку перл
 возвращает ССЫЛКУ не на данные как таковые, а на переменную, и в дальнейшем что 
 бы ни присвоили этой переменной - вы увидите это по своей ссылке:
 
 @a = (1,2);
 $ref = \@a;
 @a = (3,4);
 # теперь $ref указывает на новое содержимое @a
 второе замечание - многие встроенные операторы перла рассчитаны на то, что им на
 вход подадут переменную-массив или хеш. но никак не ССЫЛКУ. для того, чтобы
 превратить одно в другое, используются конструкции @{...} и %{...}:
 
 push @{$c[0]}, 0;     # $c[0] - ССЫЛКА на массив, @{$c[0]} - сам массив
 
 %d = ( C=> {Speed=>Good, Readability=>Bad}, Perl=>{Speed=>hmmm} );
 print keys %{$d{C}}   # $d{C} - ССЫЛКА на хеш, %{$d{C}} - сам хеш
 
 остатнее читайте в perldsc. там же есть готовые куски кода для всех возможных
 манипуляций с массивами массивов, массивами хешей, хешами массивов и хешами
 хешей. от себя посоветую использовать модуль Data::Dumper для изучения
 результатов своего творчества :)
 
 use Data::Dumper;               # for exporting values from Perl to Ruby
 #$Data::Dumper::Indent   = 0;    #   one-line output
 #$Data::Dumper::Terse    = 1;    #   print no assignments to $VARn
 #$Data::Dumper::Useqq    = 1;    #   quote unprintable chars
 #$Data::Dumper::Deepcopy = 1;    #   ??? are we really need this? ;)
 
 print Dumper(\$a), "\n", Dumper(\@e), "\n", Dumper(\%d);
 Bulat, mailto:bulatz-AT-fort.tatarstan.ru, ICQ: work 15872722, home 11849833
 
 ... Иногда для того, чтобы изменить свое восприятие мира,
 ... люди пытаются изменить сам мир
 --- GoldED+/W32 1.1.2
  * Origin: Сетевой фильтр на 5 базаров (2:5093/28.126)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 perldsc - краткое изложение   Bulat Ziganshin   15 Mar 2002 20:58:12 
 Re: perldsc - краткое изложение   Artem Chuprina   16 Mar 2002 12:17:38 
 perldsc - краткое изложение   Bulat Ziganshin   16 Mar 2002 14:27:19 
 perldsc - краткое изложение   Poul Deniskin   16 Mar 2002 03:16:18 
 perldsc - краткое изложение   Bulat Ziganshin   17 Mar 2002 01:38:31 
Архивное /ru.perl/39733c928343.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional