На этом шаге мы рассмотрим способы определения подпрограмм.
Подпрограмма может быть определена в любом месте основной программы при помощи описания
sub name [(proto)] [{block}];
Здесь
Форма
sub name [(proto)];
#! 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 используются для включения в текущую программу подпрограмм из других модулей.
На следующем шаге мы рассмотрим вызов подпрограммы.