Анимация
JavaScript
|
Главная Библионтека Но вам следует избегать создания подпрограмм с именами, как у встроенных функций и операторов Perl. Создание двух подпрограмм с одинаковыми именами приводит к появлению соответствующего предупреждения, если включен режим вывода предупреждении, в противном случае второе определение функции перекрывает первое. При вызове подпрограммы запускается ее код и возвращаемое значение передается в то место, из которого была вызвана подпрограмма. Например, данная короткая подпрограмма используется для диалога с пользователем: sub yesno { Eclnt в soEM уверка (/)?"; $answer=<STDIB>; Для инициирования подпрограммы, или, как говорят, ее вызова можно использовать подобные строки: &yesno{); или yesnoO; Второй синтаксис (без можно использовать, если подпрограмма была ранее определена в коде, a синтаксис iyesno( )допустим в любом месте кода. В этой книге используются вызовы подпрограмм без S, хотя обе формы синтаксиса могут иметь место. При вызове подпрограммы запоминает место, в котором произошел вызов, выполняет код подпрограммы и затем возвращается в основную программу к месту вызова: sub countdoAin { for($i=10; Si>=0; { print "$i -"; Eclnt "ОЗТЕЬЙ счЕЯ7: "; Подпрограммы Perl могут быть вызваны в любом месте основной программы и даже из других подпрограмм: sub world { print "World!"; sub hello { print -Hello, "; world(); > hello(); Возврат значений из подпрограмм Подпрограмма служит не только для удобной группировки кода с возможностью его вызова по имени. Подпрограмма, как и функции, операторы и выражения Perl, имеет значение. Оно называется возвращаемым значением. Возвращаемое значение подпрограммы - значение последнего вычисленного в подпрограмме выражения или же значение, явно возвращаемое оператором return. Значение подпрограммы вычисляется после вызова подпрограммы и затем используется в том месте, из которого подпрограмма была вызвана. Вот пример: su four { # Грсстейпвя подгрэхрамуа 2*4; print 8*two by four(); Здесь Perl при вычислении выражение о by four{) вызывает подпрограмму two by four{), которая возвращает значение 8. Затем вычисляется выражение 8*8 и в итоге выводится 64. Значения подпрограмм также могут явно возвращаться оператором return. Этот оператор используется для досрочного выхода из кода подпрограммы и явного указания возвращаемого значения. В приведенном ниже примере используются оба способа в1хода: subx greaterthanlOO { f Используется установленное ранее значение $х return (1) if (5х>100); > $х=70; if {x greaterthanlOOO) { Eint "$х is greater than 100\n"; > Подпрограммы могут возвращать не только скаляры, а и массивы или хэши: sub shift to uppercase { . ?words=qw( cia fbi un nato unicef ); foreach (Swords) { $ =uc($j; return{iwords)! §acrony!ns=shift to uppercase( j Аргументы У всех предгдущих примеров общим было то, что данные, с которыми они работали, были или литералами (2*4), или неременными главной программы ($х в x greaterthanlOO). Эти ограничения создают проблему переносимости кода ноднро-грамм. Для преодоления этих ограничений нужно уметь вызвать функцию и сказать ей: "Возьми эти данные и выполни с ними некоторые действия", а затем сказать ей: "Возьми другие данные и выполни с ними некоторые действия". Поведение функции должно изменяться в зависимости от передаваемых ей данных. Значения, передаваемые функции и изменяющие ее поведение, называются аргументами (мы уже неоднократно использовали в книге этот термин). Вы уже знаете, что встроенным функциям Perl (grep, sort, reverse, print и др.) можно передавать аргументы. То же относится и к вашим подпрограммам. Для передачи функции аргументов можно использовать любой синтаксис: иня фуЕицив{арт1, арг2, аргЗ); вмя фувкцяа арг1, арг2, аргЗ; £ имя фувхций{зрг1, арг2, аргЗ); 1 Чть I. :Ei Pern Вторая форма - без скобок - может быть использована, только если интерпретатор Perl уже встречал определение этой функции. в подпрограмме доступ к аргументам осуществляется посредством специальной переменной @ . В следующем примере демонстрируется передача трех строковых литералов в подпрограмму, которая выполняет их печать в виде списка. sub printarcrs { print join(,, в); printargs (market, home, roast beef); Для доступа к индивидуальным аргументам можно использовать индексы массива как и в случае любого другого массива. Однако следует помнить, что конструкция $ [01 не имеет никакого отнощения к скалярной переменной $ . sub print third argument { Использование в качестве имен переменных конструкции тип [3] - не очень прозрачный стиль программирования. Функции, в котор1х много переменных, как правило, начинаются с переименования этих переменных ~ после этого становится понятно, для чего они предназначены. Посмотрите, что имеется в виду: sub display box score { ($hits, $at bats)=8 ; print "Из $at bats гпыгак &,iro Ebferro $hits очков." ; print "064*1 результат$hits/$at bats, "\n"; di£pla/ bax saDre (50, 210); Здесь массив копируется в список ($hits, Первый элемент массива - - становится переменной ?iiits, a второй - переменной Satbats. Имена переменных использованы лишь для читабельности. Переменна содержит реальный список исходных аргументов подпрограммы. Ее изменение или изменение любого ее элемента приводит к модификации соответствующих переменных. Неявное изменение значения переменных - плохой стиль программирования, поэтому ваша функция не должна изменять значения передаваемых ей аргументов, если только это не делается осознанно. -• Передача «иров и хэшей Аргументы подпрограмм не обязательно должны быть скалярами. Вы можете передавать в подпрограмму массив ли хэш, но делать это нужно с умом. Массив ли хэш передается подпрограмме так же, как и скаляр: esorted itenB=sort numerically(gitems); В этой подпрограмме обращение к массиву осуществляется посредством пе- ременной sub { print "Сортировка..."; return (sort {$а <=> $b} 8 ); 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [ 36 ] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |