Анимация
JavaScript


Главная  Библионтека 

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

Но вам следует избегать создания подпрограмм с именами, как у встроенных функций и операторов 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