子程序(Subroutine)是Perl中用于封装可重用代码的结构,通常称为函数。本文将介绍子程序的创建、参数传递、返回值及其高级用法。


目录

  1. 子程序概述
  2. 定义与调用子程序
  3. 参数传递
  4. 返回值
  5. 作用域与变量
  6. 匿名子程序
  7. 参考资料

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. 参考资料

站内链接

出站链接

其他资源

  • 《Programming Perl》 – 子程序章节。
  • X社区:搜索 #PerlSubroutines 获取示例。

这篇指南详细介绍了Perl子程序的定义、参数、返回值及高级用法。如果需要更深入的内容(比如递归函数或模块中的子程序),请告诉我!