子程序(Subroutine)是Perl中用于封装可重用代码的结构,通常称为函数。本文将介绍子程序的创建、参数传递、返回值及其高级用法。
目录
1. 子程序概述
Perl 中的子程序是一段命名的代码块,可以通过名称调用,接受参数并返回结果。特点包括:
- 使用
sub
关键字定义。 - 参数通过特殊数组
@_
传递。 - 返回值灵活,可显式或隐式返回。
站内链接:了解变量基础,见 Perl 变量。
2. 定义与调用子程序
基本定义
use strict;
use warnings;
sub say_hello {
print "Hello, Perl!\n";
}
say_hello(); # 调用
带参数的子程序
sub greet {
my $name = shift; # 从 @_ 取第一个参数
print "Hello, $name!\n";
}
greet("Alice"); # Hello, Alice!
调用方式
- 直接调用:
greet("Bob");
- 使用
&
:&greet("Bob");
(旧风格,不推荐)。
3. 参数传递
Perl 通过 @_
数组传递参数,参数数量不限。
单参数
sub add_five {
my $num = shift @_;
return $num + 5;
}
print add_five(10), "\n"; # 15
多参数
sub add {
my ($a, $b) = @_;
return $a + $b;
}
print add(3, 4), "\n"; # 7
默认参数
sub welcome {
my ($name, $greeting) = @_;
$greeting ||= "Hello"; # 默认值
print "$greeting, $name!\n";
}
welcome("Alice"); # Hello, Alice!
welcome("Bob", "Hi"); # Hi, Bob!
4. 返回值
显式返回
使用 return
:
sub multiply {
my ($x, $y) = @_;
return $x * $y;
}
my $result = multiply(2, 3);
print "$result\n"; # 6
隐式返回
无 return
时,返回最后表达式的值:
sub subtract {
my ($x, $y) = @_;
$x - $y; # 隐式返回
}
print subtract(10, 4), "\n"; # 6
多值返回
返回列表:
sub get_info {
return ("Alice", 25);
}
my ($name, $age) = get_info();
print "$name, $age\n"; # Alice, 25
5. 作用域与变量
局部变量
使用 my
定义:
sub scope_test {
my $local = "I’m local";
print "$local\n";
}
scope_test(); # I’m local
print "$local\n" if defined $local; # 无输出
全局变量
使用 our
或外部变量:
our $global = "I’m global";
sub modify_global {
$global = "Modified";
}
modify_global();
print "$global\n"; # Modified
站内链接:更多作用域说明,见 Perl 变量。
6. 匿名子程序
不命名,直接赋值给变量:
my $add = sub {
my ($x, $y) = @_;
return $x + $y;
};
print $add->(5, 3), "\n"; # 8
闭包示例
sub counter {
my $count = 0;
return sub { $count++ };
}
my $c = counter();
print $c->(), "\n"; # 0
print $c->(), "\n"; # 1
7. 参考资料
站内链接
出站链接
- Perldoc: Subroutines – 官方子程序文档。
- Perl Maven: Subroutines – 子程序教程。
- CPAN – 下载相关模块。
其他资源
- 《Programming Perl》 – 子程序章节。
- X社区:搜索 #PerlSubroutines 获取示例。
这篇指南详细介绍了Perl子程序的定义、参数、返回值及高级用法。如果需要更深入的内容(比如递归函数或模块中的子程序),请告诉我!
发表回复