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

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

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

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


${$ref2hash}{'ΠΊΠ»ΡŽΡ‡'} = 'Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅'; # ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ значСния print $$ref2hash{'ΠΊΠ»ΡŽΡ‡'}; # доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ элСмСнта Ρ…ΡΡˆΠ°


Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ разымСнования ссылки ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, содСрТащСй ссылку Π½Π° Ρ…ΡΡˆ, примСняСтся опСрация "стрСлка", послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках указываСтся ΠΊΠ»ΡŽΡ‡ элСмСнта Ρ…ΡΡˆΠ°. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:


$ref2hash->{'Ρ‚Π΅Ρ€ΠΌΠΈΠ½'} = 'ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅'; # Π΄ΠΎΠ±Π°Π²ΠΈΠΌ элСмСнт $value = $ref2hash->{'Π₯эш'}; # Π½Π°ΠΉΠ΄Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ


Если ссылка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ Ρ…ΡΡˆΠ°, ΠΎΠ½Π°, ΠΊΠ°ΠΊ ΠΈ любой ΠΊΠ»ΡŽΡ‡ Ρ…ΡΡˆΠ°, автоматичСски прСобразуСтся Π² строку. Π’Π°ΠΊΠΈΠ΅ строки Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ссылки, Π½ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ…ΡΡˆΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ссылки содСрТит адрСс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 'SCALAR(0x335b04)' ΠΈΠ»ΠΈ 'ARRAY(0x334dd8)'. Если всС-Ρ‚Π°ΠΊΠΈ трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылки Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Ρ…ΡΡˆΠ°, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Tie::RefHash.

Аналогично созданию "массива массивов" ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ разновидности ссылочных структур Π΄Π°Π½Π½Ρ‹Ρ…: массивы Ρ…ΡΡˆΠ΅ΠΉ, Ρ…ΡΡˆΠΈ массивов ΠΈ Ρ…ΡΡˆΠΈ Ρ…ΡΡˆΠ΅ΠΉ. БсылочныС структуры ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для структурированного прСдставлСния взаимосвязанных Π΄Π°Π½Π½Ρ‹Ρ…. Для хранСния Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС массива Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ примСняСтся массив Ρ…ΡΡˆΠ΅ΠΉ (Array of Hashes, AoH). Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ массива, содСрТащий ссылки Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ…ΡΡˆΠΈ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… хранятся свСдСния ΠΎ ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅:


my $AoH = [ # этапы "Π€ΠΎΡ€ΠΌΡƒΠ»Ρ‹-1" '2006 Π³ΠΎΠ΄Π° {grandprix=>'Π‘Π°Ρ…Ρ€Π΅ΠΉΠ½Π°', date=>'2006.03.12'}, {grandprix=>'Малайзии', date=>'2006.03.19'}, {grandprix=>'Австралии', date=>'2006.04.02'}, {grandprix=>'Π‘Π°Π½-ΠœΠ°Ρ€ΠΈΠ½ΠΎ', date=>'2006.04.23'}, # ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅... ]; # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ…ΡΡˆ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся 4-ΠΉ элСмСнт массива print "Π“Ρ€Π°Π½-ΠΏΡ€ΠΈ $AoH->[3]->{grandprix} $AoH->[3]->{date}"; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: Π“Ρ€Π°Π½-ΠΏΡ€ΠΈ Π‘Π°Π½-ΠœΠ°Ρ€ΠΈΠ½ΠΎ 2006.04.23


Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Ρ…ΡΡˆΠ° список скалярных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, примСняСтся Ρ…ΡΡˆ массивов (Нash of Аrrays, HoA). ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ…ΡΡˆΠ° массивов, Π³Π΄Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС Ρ…ΡΡˆΠ° хранится ссылка Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ список ассоциированных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:


my $HoA = { # Π³ΠΎΠ΄Ρ‹ создания языков программирования 1964 => ['SIMULA', 'BASIC', 'PL/1'], 1970 => ['Forth', 'Pascal', 'Prolog'], 1979 => ['Ada', 'Modula-2'], 1987 => ['Perl', 'Haskell', 'Oberon'], 1991 => ['Python', 'Visual Basic'] }; # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ список, ассоциированный с 1987 Π³ΠΎΠ΄ΠΎΠΌ foreach my $language (sort @{$HoA->{1987}}) { print "$language "; } # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: Haskell Oberon Perl


Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Ρ…ΡΡˆΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ…ΡΡˆΠΈ, образуя Ρ…ΡΡˆ Ρ…ΡΡˆΠ΅ΠΉ (Нash of Нashes, HoH). Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ описания Ρ…ΡΡˆΠ° Ρ…ΡΡˆΠ΅ΠΉ, Π³Π΄Π΅ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ поисковым ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ассоциируСтся Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Ρ…ΡΡˆ с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅:


my $HoH = { # Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³ΠΎΠ΄Ρ‹ создания языков программирования 'Pascal' => {author=>'Niklaus Wirth', year=>1970}, 'Perl' => {year=>1987, author=>'Larry Wall'}, 'C' => {author=>'Dennis Ritchie', year=>1972} }; # Π² ΠΊΠ°ΠΊΠΎΠΌ Π³ΠΎΠ΄Ρƒ Π±Ρ‹Π» создан Pascal? print $HoH->{'Pascal'}->{'year'}; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: 1970 # ΠΊΡ‚ΠΎ создал язык Π‘ΠΈ? print $HoH->{'C'}->{'author'}; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: Dennis Ritchie


Π˜ΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования записи (record) ΠΈΠ»ΠΈ структуры (struct), Π² Perl Ρ‡Π°Ρ‰Π΅ всСго ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ Ρ…ΡΡˆΠ΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² качСствС ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для доступа ΠΊ значСниям ΠΏΠΎΠ»Π΅ΠΉ записи. Для Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим Π½Π°Π±ΠΎΡ€ записСй с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π»ΡŽΠ΄ΡΡ…. КаТдая запись Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ Ρ…ΡΡˆΠ΅ΠΌ, Π° ссылки Π½Π° записи Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² массивС. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи Π΄Π°Ρ‚Ρƒ роТдСния прСдставим Π² Π²ΠΈΠ΄Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ массива, содСрТащСго Π³ΠΎΠ΄, мСсяц ΠΈ дСнь. Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


my $family = [ # массив записСй ΠΎ сСмьС {name => 'ΠœΠΈΡ…Π°ΠΈΠ»', birthday => [1958, 11, 12]}, {name => 'Π˜Ρ€ΠΈΠ½Π°', birthday => [1955, 03, 23]}, {name => 'Маша', birthday => [1980, 07, 27]}, {name => 'Миша', birthday => [1981, 11, 28]}, {name => 'Π›Π΅Π²', birthday => [1988, 06, 24]} ]; # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Π³ΠΎΠ΄ роТдСния Маши: print "$family->[2]->{birthday}->[0]"; # ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‰Π΅: print "$family->[2]{birthday}[0]"; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: 1980


ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ структуры Π»Π΅Π³ΠΊΠΎ динамичСски ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапримСр, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ запись Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ - 'address', Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сохраним ссылку Π½Π° запись ΠΎ мСстС проТивания Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. АдрСс ΠΎΡ„ΠΎΡ€ΠΌΠΈΠΌ Π² Π²ΠΈΠ΄Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡΡˆΠ° ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ:


# адрСс Π² Π²ΠΈΠ΄Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡΡˆΠ°, Π² $address - ссылка Π½Π° Π½Π΅Π³ΠΎ: $address = {country => 'Россия', index => 641870}; # ΠΈ Ρ‚.Π΄. # Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ адрСса ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° $address: foreach my $person (@{$family}) { # ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅ΠΌ всСх $person->{address} = $address; # ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ адрСсу } # Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ индСкс для Π˜Ρ€ΠΈΠ½Ρ‹ print "$family->[1]->{address}->{index}\n"; # 641870


На рис. 11.5 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ссылочная структура Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Для доступа ΠΏΠΎ ссылкам ΠΊΠΎ всСм элСмСнтам этой структуры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ СдинствСнная имСнованная пСрСмСнная $family.

Рис. 11.5.  ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ссылочной структуры Π΄Π°Π½Π½Ρ‹Ρ…

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

Π’Π°Π±Π»ΠΈΡ†Π° 11.1. БинтаксичСскиС конструкции для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со ссылками Π½Π° Π΄Π°Π½Π½Ρ‹Π΅Π‘ΠΊΠ°Π»ΡΡ€ΠœΠ°ΡΡΠΈΠ²Π₯ΡΡˆΠ’Π·ΡΡ‚ΠΈΠ΅ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚$sref = \$scalar;$aref = \@array;$href = \%hash;Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ссылки Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚$sref = \'Π›ΠΈΡ‚Π΅Ρ€Π°Π»';$aref = [$a, $b];$href = {$a => $b};Доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки${$sref} [email protected]{$aref} @$aref%{$href} %$hrefДоступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ элСмСнта ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки$aref-> [$index] ${$aref}[$index]$href->{$key} ${$href}{$key}Доступ ΠΊ срСзу ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки@{$aref}[$i1, $i2]@{$href}{$k1, $k2}Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ref($ref) для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылкиSCALARARRAYHASH

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° Perl Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡˆΠ°Π³Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ интСрполяциСй Π² строках скалярных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ массивов. Иногда трСбуСтся Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² строку Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ выраТСния. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ссылок ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² строку Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ скалярного выраТСния, Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ΠΈ Π²Π·ΡΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ ссылку ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ \, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ссылочноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ скаляр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСфикса $. Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


$s = "localtime() ${\($x=localtime)} Π² скалярном контСкстС"; # Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 'Sun Mar 26 20:17:36 2006'


Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² строку Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ список, Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки, организуя ссылку Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ массив, Π° ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ссылочноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ массив с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСфикса @. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:


$a = "localtime() @{[localtime()]} Π² списочном контСкстС"; # Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: '36 17 20 26 2 106 0 84 1'


Бсылки, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎ этого шла Ρ€Π΅Ρ‡ΡŒ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ТСсткими ссылками. ЖСсткая ссылка (hard reference) - это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, хранящий Π² памяти адрСс Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π° ΠΈ Ρ‚ΠΈΠΏ Π΅Π³ΠΎ значСния. Π’ Perl имССтся Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ ссылок, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… символичСскими ссылками. БимволичСская ссылка (symbolic reference) - это строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ хранится Π² скалярной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ прСдставляСт ΠΈΠ· сСбя имя глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:


$referent1 = 'Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚'; # ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ссылки $symlink = 'referent' . 1; # символичСская ссылка # доступ ΠΏΠΎ символичСской ссылкС ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° print ${$symlink}; # Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ: 'Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚'


БимволичСскиС ссылки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΆΠ΅ ΠΈ Π±Ρ‹Π²Π°ΡŽΡ‚ Π½ΡƒΠΆΠ½Ρ‹, ΠΊΠΎΠ³Π΄Π° трСбуСтся Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ строк, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΈΡ… значСниям. ИспользованиС символичСских ссылок ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ ошибкам, поэтому Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ использованиС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ символичСских ссылок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π°Π³ΠΌΡ‹ use strict 'refs'.

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

ЛСкция 12. ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π’ этой Π»Π΅ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ - Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ структурирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° Perl, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ свои особСнности: Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ… опрСдСлСния ΠΈ Π²Ρ‹Π·ΠΎΠ²Π°, Π² способах ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² этой Π»Π΅ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ опрСдСлСния видимости ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Perl-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.