|
子程序可以被某个表达式调用,无论此表达式的值是否被利用。如早些的例子&marine,我们得到此表达式的值,但其值被
扔掉了。
许多时候,当调用某个子程序时,需要使用其返回值。这意味着应当注意子程序返回值。所有的Perl 子程序都会返回值,
在Perl 中返回值和不返回值是没有区别的。当然,不是所有Perl 子程序返回的值都是有用的。
由于所有的被调用的子程序都要返回值,因此使用特殊的返回值语法在大多数情况下是一种浪费。因此Larry 将之简化了。
当Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。
例如,下面的子程序:
sub sum_of_fred_and_barney{
print “Hey, you called the sum_of_fred_and_barney suroutine!\n”;
$fred + $barney; #返回值
}
子程序中最后一个被计算的表达式为$fred + $barney,因此$fred 和$barney 的和将被返回。下面是一些调用代码:
$fred = 3;
$barney = 4;
$wilma = $sum_of_fred_and_barney; #$wilma 得到7
print “\$wilma is $wilma.\n”;
$betty = 3 * &sum_of_fred_and_barney; #$betty 得到21
print “\n$betty is $betty.\n”;
上述代码将得到下面的输出:
Hey, you call the sum_of_fred_and_barney subroutine!
$wilma is 7.
Hey, you call the sum_of_fred_and_barney subroutine!
$betty is 21.
上述print 语句是用于调试的,从它可以看到子程序被调用了。当程序调试好后,应当把它们去掉。假设在上述子程序中加
入了下面的一行代码:
sub sum_of_fred_and_barney{
print “Hey, you called the sum_of_fred_and_barney subroutine!\n”;
$fred + $barney; #其值不会被返回
print“Hey, I’m returning a value now!\n”; #oops!
}
在上述例子中,最后一个被计算的表达式不是$fred + $barney;而是print 语句。其返回值通常为1,意思是“print was
succfessful(打印成功)”◆;但这不是你想要的返回值。因此当向子程序加入新的代码时要小心些,因为返回值为最后一
个被计算的表达式。
◆当print 成功时返回true,失败时返回false。下一章将了解到更多种类的失败。
因此,第二个子程序中$fred + barney 的值去哪里了呢?由于没有把它存放在任何地方,Perl 将它丢弃了。如果打开了警告,
Perl(注意到两个变量相加但其值未被使用)可能给出如下的警告信息“a useless use of addition in a void context.” 术语void
context 是说其值未被存于变量或者被别的方式使用。
“The last expression evaluated”的含义是指最后一个被求值的表达式,而非程序的最后一行。例如,下面的子程序返回$fred
和$barney 的较大值:
sub larger_of_fred_or_barney {
if ($fred > $barney){
$fred;
}else{
$barney;
}
}
最后一个被求值的表达式是$fred 或者$barney,因此其中的某个变量成为返回值。在代码实际运行前,不知道是$fred 或
$barney 的值将被返回。
上述例子没有什么价值。如果每次调用子程序时可以传递不同的参数比依靠全局变量要好许多。这将在下面进行介绍。 |
|