|
Определение подпрограммы
Подпрограммы в языке 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"; ' . j
print "системная ошибка: $!\n" if $!;
# файл "2.pi":
$x=l;
$y=0;
$z=$x/$y;
print "z= $z\n";
Peri-программа "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 )
|