Функции.
sub имя {
оператор_1;
оператор_2;
оператор_3;
}
sub say_hello {
print "hello, world!\n";
}
Определения подпрограмм могут стоять в любом месте текста программы. Определения программ
глобальны. В теле функции можно обращаться к переменным, используемым в других частях
программы.
say_hello();
$a = 3 + say_hello();
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();
Аргументы вызова функции передаются через пременную @_
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;
Локальные переменные, созданные при помощи функции 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() можно использовать на внешнем уровне программы, что необходимо при
использовании в сочетании с PERL-прагмой.
Если поставить прагму strict в начало программы, то становится небходимо использовать
обьявление переменных с помощь операции my().
use strict;
my $a;
my @b = qw(fred mike igor);
...
push @b, qw(betty);
@c = sort @b; # mistake
Преимущества:
- Программа работает несколько быстрее
- Легче искать ошибки
|