文档

函数参数

sub hello{
	$len = @args = @_;
  print "hello @args\n";
}

hello('ajanuw', 'alone'); # hello ajanuw alone

传递hash参数

sub hello{
	my (%args) = @_;
	foreach my $k (keys %args) {
		my $v = $args{$k};
		print "$k: $v\n";
	}
}

%user = (name => 'ajanuw', age => 14);
hello(%user);

return

如果没有使用 return 语句,则子程序的最后一行语句将作为返回值

sub add{
	return @_[0] + @_[1];
}

print add(1,2)."\n"; # 3

静态变量

这个在js只能用闭包实现

#!/usr/bin/perl
use feature 'state';

sub add{
	my $num = @_[0];
  state $i = 0;
	$i += $num;
	return $i;
}

add(1);
add(4);

print add()."\n"; # 5

析构返回值

sub add{
    qw/ajanuw alone/
}
my ($a, $b) = add();
print "$a and $b\n"; # ajanuw and alone

递归

#!/usr/bin/perl

sub echo{
    my $n = @_[0];
    if($n eq 0){
        return 'done.';
    }
    print "$n\n";
    return echo($n-1);
}
echo(3);

回调

#!/usr/bin/perl
use autodie;

sub asd{
    my ($n, $cb) = @_;
    &$cb($n +1);
}

asd(123, sub {
    print "@_\n";
})

闭包

sub asd{
    my $n = shift @_;
    return sub {
        $n += shift @_;
        print "$n\n";
    }
}

$x = asd(1);
&$x(2);
&$x(3);