1.如果编译器在调用之前知道此子程序的定义,或者Perl 从语法中能知道这是一个子程序调用,则子程序前的符号&是可以省略的
2.如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号:
sub division{
$_[0] / $_[1]; #第一个参数除以第二个参数
}
my $quotient = division 355, 113; #可以省略掉括号
3.特别的地方为:如果子程序和Perl 一个内嵌程序同名,则必须使用&来调用它。编译器将在调用
之前检查其定义,而非直接将它当作内嵌的函数来处理。加上&,可以确保你调用了此子程序;不加,则仅当没有同名的内
嵌函数时才能调用到它:
sub chomp {
print “Munch, Munch!\n”;
}
&chomp; #此处的&是必须的
4.规则:除非知道Perl 所有的内嵌函数,否则函数调用时都应当使用&.
5.标量并非子程序返回的唯一类型。如果你在列表context 中调用某个子程序◆,则其会返回列表值。
6.假定想得到某个范围内的数字(如范围操作符),从小到大,或者从大到小。范围操作符只能从小到大,但可以很容易的弥
补这种缺陷:
sub list_from_fred_to_barney {
if($fred < $barney) {
#Count upwards from $fred to $barney
$fred ..$banrey
} else {
#Count downwards from $fred to $barney
reverse $barney ..$fred;
}
$fred = 11;
$barney = 6;
@c = &list_from_fred_to_barney; #@c 为(11,10,9,8,7,6)
4.11 练习
1.[12]写一个名为&total 的子程序,返回一列数字的和。提示:子程序不应当有任何的I/O 操作;它处理调用的参数,返
回处理后的值给调用者。结合下面的程序来练习,它检测此子程序是否正常工作。第一组数组之和我25。
sub total{
my $sum=0;#私有变量
foreach(@_)
{$sum+=$_;}
$sum;
}
my @fred = qw{ 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of \@fred is $fred_total.\n";
print "Enter some numbers on separate lines: ";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";
2.[5]利用上题的子程序,写一个程序计算从1 到1000 的数字的和
print"The numbers from 1 to 1000 add up to",&total(1..1000),".\n";
3.[18]额外的练习:写一个子程序,名为&above_average,将一列数字作为其参数,返回所有大于平均值的数字(提示:
另外写一个子程序来计算平均值,总和除以数字的个数)。利用下面的程序进行测试:
sub averavge
{
if(@_==0) {return}
my $count=@_;
my $sum=total(@_);
$sum/$count;
}
sub above_average{
my $average=&average(@_);
my @list;
foreach my $element(@_){
if($element>$average){
push @list,$element;
}
}
@list;
}
my @fred = &above_average(1..10);
print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";
my @barney = &above_average(100, 1..10);
print "\@barney is @barney\n";
print "(Should be just 100)\n";
4.
while (defined($line = <STDIN>))
{
print “I saw $line”;
}
第一行代码值得仔细说明:我们将输入的字符串读入一个变量,检查其是否defined,如果是,则执行while 的循环体