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

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

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

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚Π°Ρ… Π² Perl ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ· стандартной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅


perldoc perlform


Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ исходных Π΄Π°Π½Π½Ρ‹Ρ…), выводящСй ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ языку Perl.


open my $report, '>', '/report.txt' or die; $old_handle = select $out; # Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ для ΠΎΡ‚Ρ‡Π΅Ρ‚Π° select $report; $^ = 'HEAD'; $~ = 'REPORT'; # описаниС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² для ΠΎΡ‚Ρ‡Π΅Ρ‚Π° while(<DATA>) { # Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ записи Π΄Π°Π½Π½Ρ‹Ρ… ($authors, $title, $year, $nick) = split ':'; write $report; # Π²Ρ‹Π²ΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠΉ строки ΠΎΡ‚Ρ‡Π΅Ρ‚Π° } close $report or die; # Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° страницы format HEAD = ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ языку Perl ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° O'Reilly Лист @# $% ---------------+--------------------+----+------------ Авторы | Π—Π°Π³Π»Π°Π²ΠΈΠ΅ |Π“ΠΎΠ΄ | ΠŸΡ€ΠΎΠ·Π²ΠΈΡ‰Π΅ ---------------+--------------------+----+------------ . format REPORT = ^<<<<<<<<<<<<<<|^<<<<<<<<<<<<<<<<<<<|@###|@>>>>>>>>>>> $authors, $title, $year, $nick ^<<<<<<<<<<<<<<|^<<<<<<<<<<<<<<<<<<<| | ~~ $authors, $title ---------------+--------------------+----+------------ . __DATA__ Cozens S.:Advanced Perl Programming,2nd ed.:2005:Panther Book Friedl J.E.F.:Mastering Regular Expressions:1997:Owls Book ...


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ report.txt:


ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ языку Perl ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° O'Reilly Лист 1 ---------------+--------------------+----+------------ Авторы | Π—Π°Π³Π»Π°Π²ΠΈΠ΅ |Π“ΠΎΠ΄ | ΠŸΡ€ΠΎΠ·Π²ΠΈΡ‰Π΅ ---------------+--------------------+----+------------ Cozens S. |Advanced Perl |2005|Panther Book |Programming,2nd ed. | | ---------------+--------------------+----+------------ Friedl J.E.F. |Mastering Regular |1997| Owls Book |Expressions | | ---------------+--------------------+----+------------ Schwartz R.L., |Learning Perl, 4th |2005| Llama Book Phoenix T., |ed. | | brian d foy | | | ---------------+--------------------+----+------------


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

ЛСкция 11. Бсылки

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

ЦСль Π»Π΅ΠΊΡ†ΠΈΠΈ: Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ со ссылками, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ссылок ΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ…, основанными Π½Π° ссылках, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ со слоТными структурами Π΄Π°Π½Π½Ρ‹Ρ….

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


my $scalar = 'Бкаляр'; # ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ссылки my $ref2scalar = \$scalar; # ссылка Π½Π° скаляр


На рис. 11.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сохранСния ссылки Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ скалярной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ скалярной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Рис. 11.1.  Бсылка Π½Π° скалярноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ '\' ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ссылку Π½Π° Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΈΠ»ΠΈ Π½Π° любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ этом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки нСльзя Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Π’ этом случаС ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вычисляСтся, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сохраняСтся Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ области памяти, ссылка Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈ возвращаСтся. НапримСр:


my $ref2literal = \'Π›ΠΈΡ‚Π΅Ρ€Π°Π»'; # ссылка Π½Π° Π»ΠΈΡ‚Π΅Ρ€Π°Π» my $ref2expression = \($n1*$n2); # ссылка Π½Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅


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


print ref($ref2scalar); # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚: 'SCALAR'


А Ρ‡Ρ‚ΠΎ получится, Ссли вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ самой ссылки? Π•Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки ΠΈ Π΅Π³ΠΎ адрСс Π² Π²ΠΈΠ΄Π΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ числа, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


print $ref2scalar; # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 'SCALAR(0x335b04)'


ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² ссылку это строковоС прСдставлСниС адрСса Π½Π΅ удастся.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ссылка, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ссылки (dereference). Для этого пСрСмСнная, содСрТащая ссылку, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π΅ΠΉ ставится Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ прСфикс: $ для скаляра, @ для массива, % для Ρ…ΡΡˆΠ°, & для ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. (Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, послС Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ прСфикса, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏ хранящСгося Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ значСния, вмСсто ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ записываСтся содСрТащая ссылку пСрСмСнная ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π΅ ссылку.) Если Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ нСоднозначности Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ выраТСния, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽ ссылку, Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ разымСнования ссылок Π½Π° скалярныС значСния:


print "${$ref2scalar} "; # ΠΈΠ»ΠΈ: $$ref2scalar print "${$ref2literal} "; # ΠΈΠ»ΠΈ: $$ref2literal print "${$ref2expression} "; # ΠΈΠ»ΠΈ: $$ref2expression


Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ скалярной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ доступС ΠΏΠΎ ссылкС, СстСствСнно, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Π½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ссылки ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΠΈΡ‚Π΅Ρ€Π°Π» Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ("Modification of a read-only value attempted"):


${$ref2scalar} = 'Новый скаляр'; # Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½ΠΎ ${$ref2literal} = 'Новый Π»ΠΈΡ‚Π΅Ρ€Π°Π»'; # ΠžΠ¨Π˜Π‘ΠšΠ!!!


Когда Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ссылаСтся нСсколько ссылочных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ этому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ любой ΠΈΠ· Π½ΠΈΡ…. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ доступно Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π° Π½Π΅Π³ΠΎ имССтся хотя Π±Ρ‹ ΠΎΠ΄Π½Π° ссылка. НапримСр:


my $ref2scalar = \$scalar; # ссылка Π½Π° скаляр my $one_more_ref = $ref2scalar; # копия ссылки Π½Π° скаляр # Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $scalar: print "${$ref2scalar} ${$one_more_ref}";


На рис. 11.2 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ситуация, ΠΊΠΎΠ³Π΄Π° нСсколько ссылок ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΡΠΊΠ°Π»ΡΡ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.

Рис. 11.2.  НСсколько ссылок Π½Π° скаляр

Если пСрСмСнная $ref2scalar пСрСстанСт ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° $scalar (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, послС undef $ref2scalar), Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $scalar всС Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ доступно Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ $one_more_ref.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ссылки Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ссылка (косвСнная ссылка) Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΠΆΠ΅ Π½Π° ссылку. Бсылка Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ссылку Π½Π° саму сСбя! Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ссылок любой Π΄Π»ΠΈΠ½Ρ‹. НапримСр:


$value = 'ПолСзноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅'; $ref1 = \$value; # ссылка Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $ref2 = \$ref1; # ссылка Π½Π° ссылку Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $ref3 = \$ref2; # ссылка Π½Π° ссылку Π½Π° ссылку Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅


МоТно ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ косвСнныС ссылки Π±Π΅Π· использования ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, нСсколько Ρ€Π°Π· примСняя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ взятия ссылки Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. НапримСр, создадим Ρ‚Π°ΠΊΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ссылок:


$ref_chain = \\\$value; # Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ссылок


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


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