Листинг 9.1. Определение подпрограммы
#!/usr/bin/perl
sub max {
my $maximum = shift @$_;
my $x;
foreach $x (@_) {
$maximum = $x if ($x > $maximum);
}
return $maximum
}
print "Наибольший аргумент=", mах(3,5,17,9), "\n";
В данном примере процедура max( ) возвращает наибольший из своих аргументов.
Данный способ определения подпрограмм не является единственным. Существуют и другие варианты:
- текст подпрограммы может храниться в отдельном файле и загружаться в основную программу при
помощи ключевых слов
do,
require,
use;
- строка, содержащая текст подпрограммы, может быть передана в качестве аргумента функции eval( ).
В этом случае компиляция кода подпрограммы осуществляется при каждом вызове функции eval( )
- анонимную подпрограмму можно определить при помощи ссылки на нее.
Конструкция do filename вызывает выполнение Perl-программы, содержащейся в файле filename.
Если файл filename недоступен для чтения, функция do возвращает неопределенное значение и присваивает
соответствующее значение специальной переменной $!. Если файл filename может быть прочитан, но
возникают ошибки при его компиляции или выполнении, то функция do возвращает неопределенное значение
и помешает в переменную $@ сообщение с указанием строки, содержащей ошибку. Если компиляция прошла
успешно, функция do возвращает значение последнего выражения, вычисленного в файле filename.
ПРИМЕЧАНИЕ Специальная переменная $! служит для хранения сообщения о последней системной ошибке,
то есть об ошибке, возникающей при обращении к операционной системе с запросом на предоставление
некоторой услуги, как, например, создание файла, чтение файла или запись в файл.
Специальная переменная $@ используется для хранения сообщения, генерируемого при последнем
обращении к функциям eval( ) или do filename
Листинг 9.2. Применение конструкции do filename
# файл "1.pl";
#!/usr/bin/perl
do "2.pl";
print "ошибка: $@\n" if $@;
do "3.pl";
print "системная ошибка: $!\n" if $!;
# файл "2.pl";
$х = 1;
$y = 0;
$z = $x/$y;
print "z= $z\n";
Perl-программа 1.pl, используя конструкцию do filename, пытается выполнить сценарии,
содержащиеся в файлах 2.pl и 3.р1 Первый из них содержит в третьей строке операцию деления на 0,
которая вызовет появление ошибки во время выполнения программы, а второй вообще не существует.
В результате выполнения файла 1.pl будут выведены следующие сообщения:
ошибка: Illegal division by zero at 2.pl line 3.
системная ошибка: No such file or directory
Ключевые слова
use и
require
используются для включения в текущую программу подпрограмм из других модулей.