1、定义子过程最普通的例子:
sub razzle{
print "OK,you have been razzled.\n";
}
razzle();
#:省略了输入参数和输出(返回值)。
#:perl向子过程传入数据和子过程传出数据的方法:所有传入的参数被当成单个平面标量列表,类似的多个返回值也被当做单个平面标量列表返回给调用者;当使用LIST也一样,任何传入的数组或散列的值都代换到一个平面的列表里面,同时也失去了他们的标识;
#:所有出入perl过程的参数都是以@_身份传入的。如果调用两个参数的函数,他们在函数内部可以作为@_数组的前两个成员访问:$_[0]和$_[1];
#:@_是一个本地数组,它的值是实际标量参数的别名(引用传参),因而如果修改了@_中的成员,那么同时也修改了对应的实际参数的值。
#:子过程的返回值是过程最后一个表达式的值。或者你可以在子过程的任何一个地方明确使用一个return语句来返回值并且推出子过程。
2、参数列表技巧
#:将 @_ 的值拷贝到一个 my 列表,这样就 可以方便使用这些正式参数( 不一样的是,这样拷贝就将引用传参的语义变为了传值传参) ,下面是一个典型的例子:
sub ayetenv {
my ($key,$value) = @_;
$ENV{$key} = $value unless $ENV{$key};
}
#:不要传值参数的情况,求最大值:
sub max {
$max = shift(@_);
for my $item (@_) {
$max = $item if $max < $item;
}
return $max;
}
$bestday = max($mon,$tue,$wed,$thu,$fri);
#:将@_填入一个散列
sub cofi{
my %options = @_;
print "Maximun verbosity.\n" if $options{verbose} == 9;
}
cofi(password => 'love',verbose => 9,socre =>0);
#:通过形参修改原始值
upcase ($v1,$v2);
sub upcase{
for (@_){ tr/a-z/A-Z/;}
}
($v3,$v4) = upcase($v1,$v2);
#:返回一个copy,不修改原始值
($v3,$v2);
sub upcase {
my @parms = @_;
for (@parms) { tr/a-z/A-Z/ }
return wantarray ? @parms : $parms[0];
}
#!/usr/bin/perl
use strict;
use warnings;
my @list1 = qw/Yan Zeng Li/;
my @list2 = qw/Wang Lu/;
sub upcase {
my @parms = @_;
for (@parms) { tr/a-z/A-Z/; print"$_\t"; last; }
print "\n";
return wantarray ? @parms : $parms[0];
}
my @newlist = upcase(@list1,@list2);
foreach (@newlist){
print "$_\t";
}
print "\n";
输出结果如下:
YAN
YAN Zeng Li Wang Lu
#:从例子可以看出,@_中存在的不是列表本事,而是把列表里面的元素一个一个的复制到数组中。