Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PerlΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 32

Автор ΠœΠΈΡ…Π°ΠΈΠ» Π¨ΠΎΡ…ΠΈΡ€Π΅Π²

Для доступа ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ссылок ΠΊ исходному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ разымСнования примСняСтся Π½ΡƒΠΆΠ½ΠΎΠ΅ число Ρ€Π°Π·. НапримСр, Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ссылок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Ρ€Π΅Ρ… прСфиксов $ ΠΌΡ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ ссылочным ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π° Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ прСфикс Π½ΡƒΠΆΠ΅Π½ для доступа ΠΊ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ:


# Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· $ref3: print ${${${$ref3}}}; # ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΠΎΡ‡Π΅: print $$$$ref3; # ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· $ref_chain: print $$$$ref_chain;


Если ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ref() ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, содСрТащСй ссылку Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎ ΠΎΠ½Π° Π²Π΅Ρ€Π½Π΅Ρ‚ строку 'REF'. Если ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² строку Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ссылки Π½Π° ссылку, Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ссылочного Ρ‚ΠΈΠΏΠ° ΠΈ адрСс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


print ref($ref_chain); # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: 'REF' print $ref_chain; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 'REF(0x334e8c)'


ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со ссылками Π½Π° массивы. Бсылка Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° "массив" Ρ‚Π°ΠΊΠΆΠ΅ создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ взятия ссылки:


my @array = ('Π­Ρ‚ΠΎ', 'список', 'Π²', 'массивС'); my $ref2array = \@array; # ссылка Π½Π° массив


Если ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ массиву Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ссылкС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° "массив", Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ссылку Π½Π° Π½Π΅Π³ΠΎ Π² ΡΠΊΠ°Π»ΡΡ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Бсылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ список Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ бСзымянного массива:


my $ref2anon = [ # ссылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив 'Π­Ρ‚ΠΎ', 'Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ', 'массив' ]; # ΠΊΠΎΠ½Π΅Ρ† присваивания ссылки my $ref2empty = []; # ссылка Π½Π° пустой Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив


АнонимныС массивы ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ссылки Π½Π° копию массива. Для этого ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ массив помСщаСтся Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки, ΠΈ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ скопировано Π² созданный Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив:


my $ref2copy = [@array]; # ссылка Π½Π° копию массива


Бсылка Π½Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив ΠΈ ссылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π½Π° рис. 11.3.

Рис. 11.3.  Бсылки Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массивы

Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки Π½Π° массив производится Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡŽ ссылки Π½Π° ΡΠΊΠ°Π»ΡΡ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с использованиСм прСфикса массива @:


# Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ @array: print "@{$ref2array} @$ref2array\n";


ЕстСствСнно, Ρ‡Ρ‚ΠΎ, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ массиву ΠΏΠΎ ссылкС, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с Π½ΠΈΠΌ Π»ΡŽΠ±Ρ‹Π΅ дСйствия, ΠΊΠ°ΠΊ ΠΈ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ массивом, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


my @array_copy = @{$ref2array}; # копия массива @{$ref2array}[0,1] = ('Новый', 'список'); # срСз массива


Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки Π½Π° элСмСнт массива оформляСтся Ρ‚Π°ΠΊ: ΠΏΠ΅Ρ€Π΅Π΄ ссылочной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, указываСтся прСфикс скалярного значСния $, Π° послС ссылочной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ указываСтся индСкс элСмСнта Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, для обращСния ΠΊ элСмСнту массива ΠΏΠΎ ссылкС имя массива замСняСтся ссылочной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:


print ${$ref2array}[0]; # ΠΈΠ»ΠΈ: $$ref2array[0]


ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ ссылкС ΠΊ элСмСнту массива Π±ΠΎΠ»Π΅Π΅ наглядно записываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инфиксной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ->, слСва ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ записываСтся имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, содСрТащСй ссылку Π½Π° массив, Π° справа - индСкс элСмСнта массива Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ "стрСлка" наглядно прСдставляСт ссылку, символы -> Π² Π½Π΅ΠΉ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


# доступ ΠΏΠΎ ссылкС ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ элСмСнта массива: my $element_value = $ref2array->[0]; # ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ значСния элСмСнта массива: $ref2array->[0] = $new_value;


Как ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ скалярным значСниям ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ссылкС ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ элСмСнтам массива, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


$ref2element = \$array[0]; # ссылка Π½Π° элСмСнт массива ${$ref2element} = $new_value; # ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ элСмСнта массива


Π’ элСмСнтах массива ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ массивы: это позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π² Perl ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы ΠΈΠ»ΠΈ "массивы массивов", ΠΊΠ°ΠΊ это дСлаСтся Π² языкС Java. Π’ этом случаС доступ ΠΊ элСмСнтам ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ записываСтся с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ "стрСлка", которая употрСбляСтся Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство Ρ€Π°Π·:


@{$ref2NxM->[$n]} # Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ массив $ref2NxM->[$n]->[$m] # скалярный элСмСнт Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива $ref2NxMxP->[$n]->[$m]->[$p] # элСмСнт 3-ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива


Для удобства чтСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ допускаСтся Π½Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ "стрСлка" ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠΈ индСксов массива Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках:


$ref2NxM->[$n][$m] # Ρ‚Π°ΠΊ Π³ΠΎΡ€Π°Π·Π΄ΠΎ симпатичнСС! $ref2NxMxP->[$n][$m][$p] # Π° Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‚Π°ΠΊ...


Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ создания Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива ΠΈΠ· Ρ‚Ρ€Π΅Ρ… строк ΠΏΠΎ ΠΏΡΡ‚ΡŒ элСмСнтов Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС:


my $ref2RxC = []; # ссылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив массивов for (my $row = 0; $row < 3; $row++) { # Ρ†ΠΈΠΊΠ» ΠΏΠΎ строкам $ref2RxC->[$row] = []; # строка: Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ массив for (my $col = 0; $col < 5; $col++) { # ΠΏΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌ $ref2RxC->[$row]->[$col] = ($row+1).'.'.($col+1); } }


НСбольшиС ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ массивы. Π­Ρ‚ΠΎ присваиваниС создаст Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ массив, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:


$ref2RxC = [ # ссылка Π½Π° Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив [1.1, 1.2, 1.3, 1.4, 1.5], # 1-я "строка" [2.1, 2.2, 2.3, 2.4, 2.5], # 2-я "строка" [3.1, 3.2, 3.3, 3.4, 3.5] # 3-я "строка" ]; # ΠΊΠΎΠ½Π΅Ρ† присваивания ссылки


На рис. 11.4 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ "массив массивов" (Аrray of Аrrays, AoA), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив.

Рис. 11.4.  ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ 'массива массивов'

Для Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΡƒΠΆΠ½ΠΎΠ΅ число Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² for ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… цикличСских конструкций:


# Ρ†ΠΈΠΊΠ» ΠΏΠΎ строкам (элСмСнтам массива Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня) for (my $row = 0; $row < @{$ref2RxC}; $row++) { # Ρ†ΠΈΠΊΠ» ΠΏΠΎ столбцам (элСмСнтам Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… массивов) for (my $col = 0; $col < @{$ref2RxC->[$row]}; $col++) { print "$ref2RxC->[$row][$col] "; } print "\n"; }


Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ построчно Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСх элСмСнтов ΠΈΠ· массива массивов:


1.1 1.2 1.3 1.4 1.5 2.1 2.2 2.3 2.4 2.5 3.1 3.2 3.3 3.4 3.5


Π’ любой массив ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ список ссылок Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


@reference_list = (\$scalar, \@array, \%hash);


МоТно Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС Π±ΠΎΠ»Π΅Π΅ простым способом, поставив ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ взятия ссылки ΠΏΠ΅Ρ€Π΅Π΄ списком ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках:


@reference_list = \($scalar, @array, %hash);


Бписки ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для измСнСния пСрСчислСнных Π² спискС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ ссылкС ΠΈ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π»Π΅ΠΊΡ†ΠΈΠΈ.

Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ссылку Π½Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎ ΠΎΠ½ автоматичСски Π±ΡƒΠ΄Π΅Ρ‚ создан. Π’ этом случаС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ автосозданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки (Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ: "Π°Π²Ρ‚ΠΎΠΎΠΆΠΈΠ²Π»Π΅Π½ΠΈΠ΅" - autovivification). НапримСр, Π²ΠΎ врСмя обращСния ΠΏΠΎ ссылкС ΠΊ элСмСнту массива автоматичСски создаСтся массив ΠΈΠ· пяти элСмСнтов, ссылка Π½Π° Π½Π΅Π³ΠΎ присваиваСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ $array_ref, Π° пятый элСмСнт ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:


$array_ref->[4] = '5-ΠΉ элСмСнт'; # присваиваниС значСния print ref($array_ref); # Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊ ΠΆΠΈΠ·Π½ΠΈ массив print scalar(@{$array_ref}); # ΠΈΠ· 5 элСмСнтов! print $$array_ref[4]; # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅


ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ примСняя автосозданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ссылок, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:


$$$$ref = 25; # ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ # ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ 2 ссылочных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ 1 скалярная print "$ref $$ref $$$ref $$$$ref\n"; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: REF(0x334dd8) REF(0x334e8c) SCALAR(0x334e98) 25


ВсС, Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ ΠΎ ссылках Π½Π° массивы, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ ссылкам Π½Π° Ρ…ΡΡˆΠΈ. Бсылка Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° "Ρ…ΡΡˆ" получаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ взятия ссылки:


my %hash = ('Π₯эш' => 'ассоциативный массив'); my $ref2hash = \%hash; # ссылка Π½Π° вСсь Ρ…ΡΡˆ print ref($ref2hash); # Π²Π΅Ρ€Π½Π΅Ρ‚: HASH


Бсылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Ρ…ΡΡˆ создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния Ρ…ΡΡˆΠ°:


my $ref2anon = { # ссылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Ρ…ΡΡˆ 'language' => 'Perl', 'author' => 'Larry Wall', 'version' => 5.8 }; # ΠΊΠΎΠ½Π΅Ρ† присваивания ссылки


ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡΡˆΠ° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ копию ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ…ΡΡˆΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· ссылку:


my $ref2copy = {%hash}; # ссылка Π½Π° копию Ρ…ΡΡˆΠ°


Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки Π½Π° Ρ…ΡΡˆ записываСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки Π½Π° массив, Π½ΠΎ с прСфиксом Ρ…ΡΡˆΠ° %. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ ссылки Π½Π° Ρ…ΡΡˆ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ссылку, для наглядности ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками:


# Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ %hash: print %{$ref2hash}, %$ref2hash;


ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ссылок с Ρ…ΡΡˆΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ дСйствия, обращая Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки:


%hash_copy = %{$ref2hash}; # копия Ρ…ΡΡˆΠ° @hash_slice= @{$ref2hash}{$key1, $key2}; # срСз Ρ…ΡΡˆΠ° (массив) @hash_keys = keys %{$ref2hash}; # ΠΊΠ»ΡŽΡ‡ΠΈ Ρ…ΡΡˆΠ° (массив)


Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки Π½Π° элСмСнт Ρ…ΡΡˆΠ° Ρ‚Π°ΠΊΠΆΠ΅ записываСтся ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ Π½Π°ΠΌ способом, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄ ссылочной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ставится прСфикс скаляра $, Π° послС Π½Π΅Π΅ - ΠΊΠ»ΡŽΡ‡ элСмСнта Ρ…ΡΡˆΠ° Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках. Бсылочная пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки: