Определение подпрограммы
Подпрограммы в языке Perl играют ту же роль, что и функции в языке С, или процедуры и функции в языке Pascal. Они выполняют две основные задачи:
- позволяют разбить одну (большую программу на несколько небольших частей, делая ее более ясной для понимания;
- объединяют операторы в одну группу для повторного использования. В языке Perl не различаются понятия "подпрограмма" и "функция", эти слова являются синонимами.
Подпрограмма может быть определена в любом месте основной программы при помощи описания:
sub name [(proto)] ({block}};
Здесь:
- name имя подпрограммы;
- (proto) прототип, конструкция, используемая для описания передаваемых подпрограмме параметров;
- {block} блок операторов, являющийся определением подпрограммы и выполняющийся при каждом ее вызове.
Форма:
sub name [ (proto)];
…представляет собой предварительное объявление подпрограммы без ее определения. Пользователь, предпочитающий помещать описания всех подпрограмм в конце основной программы, должен при вызове еще не определенной функции использовать Специальный синтаксис &лагае ИЛИ name. Если же некоторое имя предварительно объявить в качестве имени функции, то сразу после объявления к этой функции можно обращаться просто по имени без применения специального синтаксиса.
#!/usr/bin/perl sub max { my $maximum = SHIFT @$_; my $x; foreach $x (@_) { $maximum=$x if ($x > $maximum); } return $maximum } print "Наибольший аргумент=", max(3.5.17.9), "\n";
В данном примере функция max () возвращает наибольший из своих аргументов. Об использовании функции ту() и массива @_ будет рассказано ниже.
Данный способ определения подпрограмм не является единственным. Существуют и другие варианты:
- текст подпрограммы может храниться в отдельном файле и загружаться в основную программу при помощи ключевых слов do, require, use;
- строка, содержащая текст подпрограммы, может быть передана в качестве аргумента функции eval () (см. в части 10); в этом случае компиляция кода подпрограммы осуществляется при каждом вызове функции eval ();
- анонимную подпрограмму можно определить при помощи ссылки на нее (см. в части 9).
Применение функции eval () и ссылки на анонимную подпрограмму были рассмотрены ранее.
Конструкция do filename вызывает выполнение Peri-программы, содержащейся в файле filename. Если файл filename недоступен для чтения, функ-ция do возвращает неопределенное значение и присваивает соответствующее значение специальной переменной $!. Если файл filename может быть прочитан, но возникают ошибки при его компиляции или выполнении, то функция do возвращает неопределенное значение и помещает в переменную $@ сообщение с указанием строки, содержащей ошибку. Если компиляция прошла успешно, функция do возвращает значение последнего выражения, вычисленного в файле filename.
Замечание
Специальная переменная $! служит для хранения сообщения о последней системной ошибке. Такая ошибка возникает при обращении "к операционной системе с запросом на предоставление некоторой услуги, как, например, создание файла, чтение или запись в него.
Специальная переменная $@ 'используется для хранения сообщения, генерируемого при последнем обращении к функциям eval () или do filename:
# файл "l.pl": #!/usr/bin/perl \ do "2.pi"; \ print "ошибка: $@\n" if $@; do "3.pl"; '. <strong>j</strong> print "системная ошибка: $!\n" if $!; # файл "2.pi": $x=l; $y=0; $z=$x/$y; print "z= $z\n";
Perl-программа "i.pi", используя конструкцию do filename, пытается выполнить сценарии, содержащиеся в файлах "2.pi" и "З.р1". Первый из них содержит в третьей строке операцию деления на 0, вызывающую появление ошибки во время выполнения программы, а второй вообще не существует. В результате выполнения файла "i.pi" будут выведены следующие сообщения:
ошибка: Illegal division by zero at 2.pi line 3. системная ошибка: No such file or directory
Ключевые слова use и require используются для включения в текущую программу подпрограмм из других модулей.
(Директивы компилятора use и require рассмотрены в части 12)