Пока что в приведенных примерах подпрограммы использовали значение глобальных переменных, но сама идея применения подпрограмм предполагает применение заложенного в них алгоритма для обработки передаваемых им параметров. Когда подпрограмма вызывается с набором аргументов, ей передается специальный массив с предопределенным именем
sub cube { # вычислить куб числа
return $_[0] * $_[0] * $_[0]; # умножить аргумент
}
print cube(2); # будет напечатано 8
Количество переданных аргументов можно выяснить, запросив число элементов массива
print2files($message, $file1, $file2, $file3);
sub print2files { # вывести текст в несколько файлов
my $text = shift; # 1-й параметр - текст
while (@_) {
my $file = shift; # очередное имя файла
open my $fh, ">>$file" or die;
print $fh $text;
close $fh or die;
}
}
Если переданные аргументы заданы переменными, то массив параметров
sub sum2 { # вычислить сумму 2-х чисел
$_[0] = $_[1] + $_[2]; # поместить сумму в 1-й аргумент
return;
}
my $a = 1, $b = 2, $sum = 0;
sum2($sum, $a, $b);
print "$a+$b=$sum"; # будет напечатано: 1+2=3
Опыт показывает, что изменение значения аргументов ведет к трудно обнаруживаемым ошибкам и осложняет сопровождение программы, поэтому должно использоваться в исключительных случаях и всегда оговариваться в комментариях. Общепринятым способом работы с параметрами подпрограммы является присваивание значения аргументов списку переменных: это предохраняет аргументы от изменения и позволяет работать не с элементами массива, а с удобно названными переменными. Это видно из следующего примера:
sub get_file { # считать данные из файла
my ($path, $file) = @_; # присвоить аргументы в переменные
return unless -e "$path/$file"; # авария: файла нет
open my $fh, '<', "$path/$file" or return;
my @lines = <$fh>; # прочитать все строки файла в массив
close $fh or return;
return @lines; # вернуть массив строк файла
}
my @data = get_file('/tmp', 'log.txt');
Хотя подпрограмма может изменять значения глобальных переменных в вызывающей программе, требования надежности предписывают всегда передавать исходные данные в подпрограмму в виде аргументов, а результат ее работы получать в виде возвращаемого значения.
По той же причине, по которой подпрограмма не может возвращать несколько списков, она не может получать несколько отдельных списков в виде аргументов. Например, если подпрограмма вызвана так:
При необходимости можно объявить подпрограмму до ее использования (forward declaration), а определение ее отнести в конец программного файла. При объявлении тело подпрограммы не записывается. Например:
sub factorial; # вычислить факториал числа
В объявлении подпрограмм могут указываться прототипы, о которых речь пойдет немного позднее в этой лекции.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии