Шаг 109.
Определение подпрограммы

    На этом шаге мы рассмотрим способы определения подпрограмм.

    Подпрограмма может быть определена в любом месте основной программы при помощи описания

  sub name [(proto)] [{block}];

    Здесь

    Форма

  sub name [(proto)];
представляет собой предварительное объявление подпрограммы без ее определения. Пользователь, предпочитающий помещать описания всех подпрограмм в конце основной программы, должен при вызове еще не определенной функции использовать специальный синтаксис &name или name(). Если же некоторое имя предварительно объявить в качестве имени функции, то сразу после объявления к этой функции можно обращаться просто по имени без применения специального синтаксиса.
#! perl -w
sub max {
  my $maximum = shift @$_;
  my $x;
  foreach $x (@_) {
    $maximum=$x if ($x > $maximum) ;
  }
  return $maximum;
} 
print "Наибольший аргумент=", max(3,5,17,9), "\n";
Текст этой программы можно взять здесь.

    В данном примере функция max() возвращает наибольший из своих аргументов. Об использовании функции my() и массива @_ будет рассказано позже.

    Данный способ определения подпрограмм не является единственным. Существуют и другие варианты:

    Применение функции eval() и ссылки на анонимную подпрограмму были рассмотрены ранее.

    Конструкция do filename вызывает выполнение Perl-программы, содержащейся в файле filename. Если файл filename недоступен для чтения, функция do возвращает неопределенное значение и присваивает соответствующее значение специальной переменной $!. Если файл filename может быть прочитан, но возникают ошибки при его компиляции или выполнении, то функция do возвращает неопределенное значение и помещает в переменную $@ сообщение с указанием строки, содержащей ошибку. Если компиляция прошла успешно, функция do возвращает значение последнего выражения, вычисленного в файле filename.


    Замечание. Специальная переменная $! служит для хранения сообщения о последней системной ошибке. Такая ошибка возникает при обращении к операционной системе с запросом на предоставление некоторой услуги, как, например, создание файла, чтение или запись в него.

    Специальная переменная $@ используется для хранения сообщения, генерируемого при последнем обращении к функциям eval() или do filename.


    Файл perl109_2.pl:

#! perl -w
do "2.pl";
print "ошибка: $@\n" if $@;
do "3.pl";
print "системная ошибка: $!\n" if $!;

    Файл 2.pl:

$x=l;
$y=0;
$z=$x/$y;
print "z= $z\n";
Тексты этих программ можно взять здесь.

    Perl-программа perl109_2.pl, используя конструкцию do filename, пытается выполнить сценарии, содержащиеся в файлах 2.pl и 3.рl. Первый из них содержит в третьей строке операцию деления на 0, вызывающую появление ошибки во время выполнения программы, а второй вообще не существует. В результате выполнения файла perl109_2.pl будут выведены следующие сообщения:

ошибка:   Illegal division by zero at 2.pl  line 3. 
системная ошибка:  No such file or directory

    Ключевые слова use и require используются для включения в текущую программу подпрограмм из других модулей.

    На следующем шаге мы рассмотрим вызов подпрограммы.




Предыдущий шаг Содержание Следующий шаг