Аргументы.
Аргументы вызова функции передаются через пременную @_
sub say_hello_to { print "Hello, $_[0]!\n"; } say_hello_to("world"); sub say { print "$_[0], $_[1]!\n"; } say_hello_to("hello", "world");
Пременная @_ является локальной для подпрограммы. Если для @_
устанавливается глобальное значение, то оно затеняется на время выполнения подпрограммы.
sub add { $sum = 0; foreach $_ (@_) { $sum += $_; }
return $sum; } $a = add(4, 5, 6); print add(1..5);
Локальные переменные в функциях.
При помощи операции my можно создавать локальные переменные
sub add { my($sum); $sum = 0; foreach $_ (@_) { $sum += $_; }
return $sum; }
sub bigger_than_100 { # создает список всех элементов массива > 100 my(@result); foreach $_ (@_) { if($_ > 100) { push(@result, $_); } } return @result; }
sub bigger_than { # создает список всех элементов массива > 100 my($n, @values); ($n, @values) = @_;
my($result); foreach $_ (@values) { if($_ > $n) { push(@result, $_); } } return @result; } @new = bigger_than(100, @list); @this = bigger_than(5, 1, 5, 15, 30); # @this содержит (15, 30)
Использовали две локальные переменные - это удобнее, чем указывать $_[0]
и @_[1..$#_].
Список, создаваемый my, можно использовать в правой части выражения:
my($n, @values) = @_;
my($sum) = 0;
Определение пользовательской функции.
sub имя { оператор_1; оператор_2; оператор_3; }
sub say_hello { print "hello, world!\n"; }
Определения подпрограмм могут стоять в любом месте текста программы. Определения программ глобальны. В теле функции можно обращаться к переменным, используемым в других частях программы.
Полулокальные переменные. Функция local.
Локальные переменные, созданные при помощи функции local, видны в самой функции и функциях, вызываемых из нее.
Операцию my можно использовать только для обьявления простых скалярных переменных, переменных-массивов и хеш-переменных, для переменной local такие ограничения не установлены.
$value = "original"; tellme(); spoof(); tellme();
sub spoof { local ($value) = "temporary"; tellme(); }
sub tellme { print "Current value is $value\n"; }
Результат выполнения программы:
Current value is original Current value is temporary Current value is original
Создаваемые операцией my переменные файлового уровня.
Операцию my() можно использовать на внешнем уровне программы, что необходимо при использовании в сочетании с PERL-прагмой.
Если поставить прагму strict в начало программы, то становится небходимо использовать обьявление переменных с помощь операции my().
use strict; my $a; my @b = qw(fred mike igor); ... push @b, qw(betty); @c = sort @b; # mistake
Преимущества:
Программа работает несколько быстрее Легче искать ошибки
Возвращаемые значения.
sub sum_of_a_and_b { return $a + $b; }
При вычислении в списочном контексте подпрограмма может возвращать список
sub list_of_a_and_b { return ($a, $b); } $a = 5; $b = 6; @c = list_of_a_and_b();