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

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

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

Она вычисляСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π‘ Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ арифмСтичСскоС дСйствиС Π½Π°Π΄ всСми элСмСнтами списка:


@result = map $_*10, (11, 32, 55); # Ρ€Π°Π±ΠΎΡ‚Π° со списком # Π² @result Π±ΡƒΠ΄Π΅Ρ‚ (110, 320, 550)


ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ map ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная $_ локально устанавливаСтся ΠΊΠ°ΠΊ синоним Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта списка, поэтому ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $_ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ измСнСнию ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта массива. Π’Π°ΠΊΠΈΠΌ способом ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния элСмСнтов массива. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π±Π»ΠΎΠΊΠΎΠΌ, ΠΊΡƒΠ΄Π° помСстим ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ вычислСния Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния (Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта большС 20, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π΅ΡΡΡ‚Π΅Ρ€ΡΡ‚ΡŒΡΡ):


@array = (11, 32, 55); # исходный массив @result = map {if ($_ > 20) {$_*=10;} else {$_;} } @array; # Π² @result Π±ΡƒΠ΄Π΅Ρ‚ (11, 320, 550)


Бписок ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ join, которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт списка ΠΊ строкС, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты списка Π² ΠΎΠ΄Π½Ρƒ строку, вставляя ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ строку Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. НапримСр:


@array = (5..10); # ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΡ‹ΠΉ список $delimiter = ':'; # Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ элСмСнтов списка Π² строкС $string = join $delimiter, @array; # объСдинСниС Π² строку # Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ $string содСрТит '5:6:7:8:9:10'


ΠžΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ раздСлСния строки ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ Π½Π° список строк выполняСт встроСнная функция split. Она раздСляСт строку ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… строк. МоТно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ число раздСляСмых подстрок, Ρ‚ΠΎΠ³Π΄Π° строка Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π΅ Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ Π½Π° это число элСмСнтов. НапримСр:


$string = '5:6:7:8:9:10'; # исходная строка $delimiter = ':'; # Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ подстрок $limit = 3; # число элСмСнтов @strings = split $delimiter, $string, $limit; # Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ # Π² @strings содСрТится ('5', '6', '7:8:9:10')


Ѐункция split ΠΈΠΌΠ΅Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС возмоТностСй, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ сказано Π² Π»Π΅ΠΊΡ†ΠΈΠΈ, посвящСнной рСгулярным выраТСниям. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· систСмной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ perldoc (послС Ρ„Π»Π°Π³Π° -f указываСтся имя искомой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ):


perldoc -f split


ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, ΠΊΠ°ΠΊ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ списки: ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ списки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Об этом Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассказано Π² Π»Π΅ΠΊΡ†ΠΈΠΈ 12.

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


@two = ('A', 'B') x 2; # Π±ΡƒΠ΄Π΅Ρ‚: ('A', 'B', 'A', 'B') @three = (@one) x 3; # Π² @three Ρ‚Ρ€ΠΈΠΆΠ΄Ρ‹ повторится @one


Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ повторСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ значСния всСм элСмСнтам массива, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ undef() ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎ числу элСмСнтов массива:


@array = (undef()) x @array; # ΠΈΠ»ΠΈ (undef) x scalar(@array)


ΠŸΡ€ΠΈ нСобходимости ввСсти Π΄Π°Π½Π½Ρ‹Π΅ Π² массив ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ упомянутой Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π²Π²ΠΎΠ΄Π° строк <>, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΉ строки ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ скалярном контСкстС опСрация "кристалл" считываСт ΠΎΠ΄Π½Ρƒ строку Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π² Π΄ΠΈΠ°Π»ΠΎΠ³Π΅ ввСсти значСния Π² массив ΠΈΠ· пяти строк:


for (@stdin = (), $n = 0; $n < 5; $n++) { print 'Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ N ', $n+1, ':'; $stdin[$n] = <>; # ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ строку Π² $n-ΠΉ элСмСнт массива }


Π’ списочном контСкстС "кристалл" Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π² массив Π·Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ всС строки Ρ„Π°ΠΉΠ»Π°. НапримСр, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ массив Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ с консоли:


print "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ значСния - ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π² строкС.", "Для окончания Π²Π²ΠΎΠ΄Π° Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Ctrl-Z (ΠΈΠ»ΠΈ Ctrl-D).\n"; @stdin = <>; # ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС строки ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π² массив print "Π’Ρ‹ Π²Π²Π΅Π»ΠΈ ", scalar @stdin, " Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.\n";


ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ <> Π²Π²ΠΎΠ΄ΠΈΡ‚ строки ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ часто Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΏΡ€ΠΈ дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Ѐункция chomp удаляСт символы ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки Π² ΠΊΠΎΠ½Ρ†Π΅ строки (Π² скалярном контСкстС) ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка (Π² списочном контСкстС) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±Ρ‰Π΅Π΅ число ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… символов.


chomp @stdin; # ΡƒΠ±Ρ€Π°Ρ‚ΡŒ \n Π² ΠΊΠΎΠ½Ρ†Π΅ всСх элСмСнтов массива $n_count = chomp $string; # ΡƒΠ±Ρ€Π°Ρ‚ΡŒ \n Π² ΠΊΠΎΠ½Ρ†Π΅ строки


ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ функция chop отсСкаСт любой послСдний символ Ρƒ строки (Π² скалярном контСкстС) ΠΈΠ»ΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка (Π² списочном контСкстС) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ послСдний отсСчСнный символ.


$last_char = chop $string; # ΠΎΡ‚ΡΠ΅Ρ‡ΡŒ послСдний символ строки chop @array; # ΠΎΡ‚ΡΠ΅Ρ‡ΡŒ послСдний символ Π² элСмСнтах массива


Если Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ символов ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ chomp Π±ΠΎΠ»Π΅Π΅ бСзопасно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ удаляСт Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΠ΅ символы Π² ΠΊΠΎΠ½Ρ†Π΅ строки.

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Perl-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΅ΠΉ доступны значСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… массивов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… хранится полСзная слуТСбная информация. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… массивов:


@ARGV Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для выполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ @INC список ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для поиска Π²Π½Π΅ΡˆΠ½ΠΈΡ… Perl-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ @_ массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠ»ΠΈ Π±ΡƒΡ„Π΅Ρ€ для split


РассмотрСнныС Π² этой Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ со списками ΠΈ массивами ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ программисту ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСдства эффСктивной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅ΠΈ массивов стали ассоциативныС массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π»Π΅ΠΊΡ†ΠΈΠΈ.

ЛСкция 6. Π₯эши

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

ЦСль Π»Π΅ΠΊΡ†ΠΈΠΈ: ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ΠΌ срСдств для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ…ΡΡˆΠ°ΠΌΠΈ Π² Perl. ΠžΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ способы примСнСния ассоциативных массивов для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ассоциативныС связи ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· основных Π²ΠΈΠ΄ΠΎΠ² связСй ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ наряду с наслСдованиСм (связями Ρ‚ΠΈΠΏΠ° "ΠΏΡ€Π΅Π΄ΠΎΠΊ-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ") ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠ΅ΠΉ (связями Ρ‚ΠΈΠΏΠ° "Ρ‡Π°ΡΡ‚ΡŒ-Ρ†Π΅Π»ΠΎΠ΅"). Ассоциации ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ логичСскиС связи ΠΌΠ΅ΠΆΠ΄Ρƒ сущностями ΠΏΠΎ ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ программистом ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡŽ. Ассоциативная связь ΠΏΠΎΠ΄ΠΎΠ±Π½Π° стрСлкС Π½Π° схСмС, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Часто ассоциации ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для нахоТдСния ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ значСния. Π’ этом случаС Π΄Π²Π΅ части ассоциативной связи соотвСтствСнно Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ поисковым ΠΊΠ»ΡŽΡ‡ΠΎΠΌ (key) ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ (value), ассоциированным с этим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. На этом ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ основана классичСская структура Π΄Π°Π½Π½Ρ‹Ρ…, называСмая словарСм (dictionary).

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

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ…ΡΡˆ прСдставляСтся Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΈΠΏ Ρ…ΡΡˆΠ°, которая записываСтся с Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ прСфиксом % ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π­Ρ‚ΠΎΡ‚ прСфикс ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это пСрСмСнная-Ρ…ΡΡˆ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится Π½Π°Π±ΠΎΡ€ ассоциативных связСй, ΠΈΠ½Π°Ρ‡Π΅ говоря, ΠΏΠ°Ρ€ "ΠΊΠ»ΡŽΡ‡ - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅":


%hash # пСрСмСнная-Ρ…ΡΡˆ


НСпосрСдствСнныС Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ…ΡΡˆΠ° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны Π² Π²ΠΈΠ΄Π΅ списочного Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСтся ΠΊΠ°ΠΊ список Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках, состоящий ΠΈΠ· элСмСнтов Ρ…ΡΡˆΠ°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π΅ состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: поискового ΠΊΠ»ΡŽΡ‡Π° ΠΈ связанного с Π½ΠΈΠΌ значСния, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… символами =>, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: