定义和调用子程序

使用sub关键字定义子程序roll,该子程序用于掷色子,它返回1-6之间的随机整数:

sub roll{
  print 1 + int(rand(6));
}

注意:

在定义子程序时,不要随意在子程序名称后面加上小括号,sub f(){}sub f{}是有很大区别的,前者是一种使用原型(prototype)的子程序定义方式,通常称为原型子程序。在本章节的后面将详细介绍原型子程序。

定义好roll子程序后,有几种调用子程序的方式:

  • 使用子程序名称调用子程序
  • 使用sigil前缀&调用子程序
  • 子程序名称后面加上小括号

不同调用方式的行为不同,本章后面将详细介绍各种不同调用方式的区别。

例如:

# 定义子程序
sub roll{
  print 1 + int(rand(6));
}

# 不同调用方式
roll;
roll();
&roll;
&roll();

可以使用return关键字(return实际上也是一个内置函数)设置子程序的返回值,return会使子程序立即退出,即让子程序的执行流程立即终止。例如,返回掷色子的随机整数值,而不是输出它:

sub roll{
  return 1+int(rand(6));
}

设置子程序的返回值后,调用子程序时它就有了返回值。使用返回值的其中一种方式是将返回值赋值给变量:

my $random = &roll;

还可以为子程序传递参数,使得子程序内部可以使用传递进来的数据。Perl子程序的参数处理比较特殊,在后面会详细解释。

sub roll{
  my $num = shift @_;  # 获取传递的第一个参数
  return 1 + int( rand($num) );
}

# 调用参数时,传递参数
my $random = roll(6);