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

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

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

МоТно Ρ‚ΠΎ ΠΆΠ΅ самоС Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° foreach, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ всС элСмСнты массива, рассматривая ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ $_ ΠΊΠ°ΠΊ синоним Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта массива (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ пСрСмСнная $_ совмСщаСтся с ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ элСмСнтом массива):


print "$_ " foreach @array;


Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Perl-программист Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ свой способ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх элСмСнтов массива Π² ΠΏΠΎΠ»Π½ΠΎΠΌ соотвСтствии с Π»ΠΎΠ·ΡƒΠ½Π³ΠΎΠΌ TIMTOWTDI.

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


$" = ':'; # установим Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ элСмСнтов print "@array";


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


$fifth = (10..15)[5]; # Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ $fifth = 15;


ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ индСксу ΠΊ элСмСнту Π² спискС констант ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ смысл, Ссли индСкс динамичСски вычисляСтся ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ дСсятичноС число Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅:


$hex = (0..9,'A'..'F')[$dec]; # ΠΏΡ€ΠΈ $dec==12 Π² $hex Π±ΡƒΠ΄Π΅Ρ‚ 'C'


ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ элСмСнту списка, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. НапримСр, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ дСнь мСсяца, зная, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ 3-ΠΉ индСкс Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ спискС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ localtime:


$month_day = (localtime)[3]; # элСмСнт списка с индСксом 3


Π’ Perl Π΅ΡΡ‚ΡŒ удобная Ρ„ΠΎΡ€ΠΌΠ° обращСния ΠΊ нСскольким элСмСнтам массива ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, называСмая срСзом массива. Π‘Ρ€Π΅Π· (slice) - это Π½Π°Π±ΠΎΡ€ элСмСнтов массива, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ списком индСксов этих элСмСнтов. Π‘Ρ€Π΅Π· обозначаСтся ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ скобками послС ΠΈΠΌΠ΅Π½ΠΈ массива, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… пСрСчислСны индСксы элСмСнтов. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСза - это список, ΠΏΡ€ΠΈ записи срСза ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ массива сохраняСтся прСфикс @. Π‘Ρ€Π΅Π· массива Π² частном случаС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΈΠΌ индСксом. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ срСзов массивов:


@array[0,1] # Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ($array[0], $array[1]) @array[5..7] # Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ($array[5],$array[6],$array[7]) @array[3,7,1] # Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ($array[3],$array[7],$array[1]) @array[@indexes] # срСз, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ массивом индСксов @array[5] # список ($array[5]), Π° Π½Π΅ скаляр $array[5]


Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСзов ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСниями Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов, находящихся Π² любом мСстС массива:


# ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ значСния пяти элСмСнтам: @array[5..9] = qw(FreeBSD Linux MacOS NetWare Windows); # ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами значСния 1-Π³ΠΎ ΠΈ послСднСго элСмСнтов: @array[0,-1] = @array[-1,0]; # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ элСмСнты с индСксами ΠΎΡ‚ $start Π΄ΠΎ $finish print @array[$start .. $finish];


Π‘Ρ€Π΅Π·Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ массивам, Π½ΠΎ ΠΈ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ спискам, Π² Ρ‚ΠΎΠΌ числС Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌ.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°ΠΊΠΈΠΌ популярным Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ массивы, Π² Perl сущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Когда трСбуСтся ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ списка, ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ извлСкая ΠΈΠ· Π½Π΅Π³ΠΎ элСмСнты, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ, примСняСтся встроСнная функция shift. Она удаляСт ΠΈΠ· массива ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, возвращая Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Когда shift примСняСтся ΠΊ пустому списку, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:


$first = shift @array; # ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π² $first # синоним: ($first, @array) = @array;


Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ закончится послС извлСчСния ΠΈΠ· Π½Π΅Π³ΠΎ послСднСго элСмСнта, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


while (my $first = shift @array) { # ΠΏΠΎΠΊΠ° @array Π½Π΅ опустССт print "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ элСмСнт $first."; print "ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ", scalar @array, " элСмСнтов\n"; }


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ scalar @array ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈΠ½Π°Ρ‡Π΅ print воспримСт @array ΠΊΠ°ΠΊ список для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ значСния массива. БущСствуСт противополоТная shift функция unshift, которая вставляСт свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² массив ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом, сдвигая ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты Π²ΠΏΡ€Π°Π²ΠΎ.


unshift @array, $e1,$e2,$e3; # Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ значСния Π² Π½Π°Ρ‡Π°Π»ΠΎ # синоним: @array = ($e1,$e2,$e3, @array);


Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ массива ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ стСк, Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ LIFO ("last in, first out", "послСдним ΠΏΡ€ΠΈΡˆΠ΅Π» - ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΡˆΠ΅Π»"). Для добавлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² стСк примСняСтся опСрация push, которая добавляСт элСмСнты Π² ΠΊΠΎΠ½Π΅Ρ† массива:


push @stack, $new; # Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² ΠΊΠΎΠ½Π΅Ρ† массива # синоним: @stack = (@stack, $new);


Для извлСчСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния ΠΈΠ· стСка слуТит встроСнная функция pop, которая удаляСт послСдний элСмСнт массива, возвращая Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:


$last = pop @stack; # ΠΈΠ·ΡŠΡΡ‚ΡŒ послСдний элСмСнт массива


ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ push ΠΈ shift ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ список, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ элСмСнты Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Π΅Ρ†, Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° (Π² соотвСтствии с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ FIFO, "first in, first out", "ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΡ€ΠΈΡˆΠ΅Π» - ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΡˆΠ΅Π»").

Для удалСния ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Ρ‹ подсписка Π² массивС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ splice, которая удаляСт ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ подряд элСмСнты массива, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ индСксом ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта ΠΈ количСством удаляСмых элСмСнтов, ΠΈ замСняСт ΠΈΡ… Π½ΠΎΠ²Ρ‹ΠΌ списком (Ссли ΠΎΠ½ ΡƒΠΊΠ°Π·Π°Π½), возвращая список ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов.


@array = (1..7); # исходный массив $offset = 2; $size = 4; # смСщСниС ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ удаляСмого списка @deleted = splice @array, $offset, $size, qw(Π½ΠΎΠ²Ρ‹ΠΉ список); # Π² @array Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ (1, 2, 'Π½ΠΎΠ²Ρ‹ΠΉ', 'список', 7) # Π² @deleted ΠΏΠΎΠΏΠ°Π»ΠΈ 4 ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… элСмСнта (3, 4, 5, 6)


Если список для вставки Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ подсписок ΠΎΡ‚ элСмСнта с индСксом $offset Π² количСствС $size элСмСнтов просто удаляСтся.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ сортировки списка выполняСтся встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sort, которая, Π½Π΅ измСняя своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список, отсортированный ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ элСмСнтов исходного списка. Поясним Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:


@unsorted = (12, 1, 128, 2, 25, 3, 400, 53); @sorted = sort @unsorted; # Π² @sorted Π±ΡƒΠ΄Π΅Ρ‚ (1, 12, 128, 2, 25, 3, 400, 53)


Если Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ список Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ сравнСниС Π΄Π²ΡƒΡ… элСмСнтов сортируСмого списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ значСния -1, 0, 1 - ΠΎΠ½ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт мСньшС, Ρ€Π°Π²Π΅Π½ ΠΈΠ»ΠΈ большС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. ΠŸΡ€ΠΈ сравнСнии чисСл это ΠΏΡ€ΠΎΡ‰Π΅ всСго ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ <=>, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


@sorted = sort {$a <=> $b } @unsorted; # Π² @sorted Π±ΡƒΠ΄Π΅Ρ‚ (1, 2, 3, 12, 25, 53, 128, 400)


Π’ Π±Π»ΠΎΠΊΠ΅ сравнСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ $a ΠΈ $b содСрТат значСния Π΄Π²ΡƒΡ… Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… сравниваСмых элСмСнтов. Для выполнСния сортировки ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ достаточно ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ мСстами {$b <=> $a }. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ для сортировки Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ сравнСния строк {$b cmp $a }. ВмСсто Π±Π»ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ слоТныС сравнСния элСмСнтов сортируСмого списка.

ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΡƒ всСх элСмСнтов списка Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС выполняСт встроСнная функция reverse, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ список, Π½Π΅ мСняя исходного:


@array = qw(Do What I Mean); # исходный список @backwards = reverse @array; # остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ # Π² @backwards Π±ΡƒΠ΄Π΅Ρ‚ ('Mean', 'I', 'What', 'Do')


Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ позволяСт сначала ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнты Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС:


@backwards = reverse(sort(@array)); # Π² @backwards Π±ΡƒΠ΄Π΅Ρ‚ ('What', 'Mean', 'I', 'Do')


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΎ всСх ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΠΎ ТСланию программиста Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках, Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ИмСя Π² своСм распоряТСнии ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ reverse ΠΈΠ»ΠΈ splice, программист ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ вСсьма Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ короткая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Perl, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ цикличСский сдвиг массива трСмя Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reverse:


my @array = qw/Н А Π§ А Π› О К О Н Π• Π¦/; # исходный массив my $i = 3; # сдвиг массива Π’Π›Π•Π’Πž Π½Π° 3 элСмСнта my $n = @array; # число элСмСнтов массива # Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сдвига КСна Вомпсона (1971) @array[0 ..$i-1] = reverse @array[0 .. $i-1]; @array[$i .. $n-1] = reverse @array[$i .. $n-1]; @array[0 .. $n-1] = reverse @array[0 .. $n-1]; print "@array\n"; # Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: А Π› О К О Н Π• Π¦ Н А Π§


Ѐункция map позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствия Π½Π°Π΄ всСми элСмСнтами массива, поэтому Π΅Π΅ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ вмСсто Ρ†ΠΈΠΊΠ»Π°. Π£ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π°:


@result = map Π’Π«Π ΠΠ–Π•ΠΠ˜Π•, БПИБОК @result = map Π‘Π›ΠžΠš БПИБОК


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