1.调用子程序:可以使用子程序的名字(带有&)来调用子程序。
2.Perl中所有的变量都是全局的。
3.参数
$n = &max(10,15);
sub max{ #和&larger_of_fred_or_barney 比较
If($_[0] > $_[1]){
$_[0];
}else{
$_[1];
}
}
4.@_是子程序的一个私有变量◆;如果有一个全局变量@_,它将在此子程序调用前存储起来,当子程序调用完 成后,其早期 的值会被重新赋还给@_◆。这意味着当将参数传递给子程序时不用担心它会影响此程序中其它 子程序的@_这个变量的。
5.子程序中的私有变量
sub max {
my($m,$n); #新的,私有变量
($m,$n) = @_; #赋值 一步:my($m,$n) = @_;
if($m > $n) {$m} else{$n}
}
◆ 这些变量是此代码块中的私有的(或者局部的)变量;别的$m 和$n 不会影响此处的两个变量。而且,其它地方的代码不
能访问或者修改这些变量。
◆在if 代码块内部,其语句没有分号。Perl 允许省略括号中最后一条语句的分号,在实际代码中,通常仅当此代码
块仅包含一条语句时才省略此分号。
6.更好的max程序
$maximum = &max(3,5,10,4,6);
sub max {
my($max_so_far) = shift @_;
foreach (@_){
if($_>$max_so_far){
$max_so_far=$_;
}
}
$max_so_far;
}
如果调用max子程序时参数为空,shift返回undef,foreach循环体一次都不执行,所以子程序返回undef。
7.my变量的注释
① my 操作不会改变赋值参数的context(◆记住,如果没有使用括号,my 仅定义一个变量)
my ($num) = @_; #列表context, 同($sum) = @_;
my $num = @_; #标量context,同$num = @_;
②注意
my $fred, $barney; #错误!没有定义$barney
my ($fred, $barney); #两个均定义了
my @phone_number; 可以使用my 创建新的,私有数组
8.使用strict Pragma
①希望Perl 严格一些;那可以使用strict pragma
②告诉Perl 进行更严格的语法检测,需要在程序顶端use strict #迫使采用更严格的检测
9.省略符号&
①如果编译器在调用之前知道此子程序的定义,或者Perl 从语法中能知道这是一个子程序调用
(◆例如,如果用括号将一些参数括起来,那其为函数调用),则子程序前的符号&是可以省略的
my @cards = shuffle(@deck_of_cards); # &是不必要的
②如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号:
sub division{
$_[0] / $_[1]; #第一个参数除以第二个参数
}
my $quotient = division 355, 113; #可以省略掉括号
③如果子程序和Perl 一个内嵌程序同名,则必须使用&来调用它。编译器将在调用之前检查其定义,而非直接将它当作内嵌的函数来处 理。加上&,可以确保你调用了此子程序;不加,则仅当没有同名的内嵌函数时才能调用到它。
10.非标量返回值
◆ 标量并非子程序返回的唯一类型。如果你在列表context 中调用某个子程序
◆你可以使用wantarray 函数来判断一个子程序是在标量还是列表context 中使用的,这可以让你轻松的写出恰当的子程序。
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)
如果return 后没有任何参数则在标量context 中将返回undef,而在列表context 中将返回空列表。这有助于检验子程序是否返回了正确信息,提示调用者当前不能返回更有意义的值。
2.Perl中所有的变量都是全局的。
3.参数
$n = &max(10,15);
sub max{ #和&larger_of_fred_or_barney 比较
If($_[0] > $_[1]){
$_[0];
}else{
$_[1];
}
}
4.@_是子程序的一个私有变量◆;如果有一个全局变量@_,它将在此子程序调用前存储起来,当子程序调用完 成后,其早期 的值会被重新赋还给@_◆。这意味着当将参数传递给子程序时不用担心它会影响此程序中其它 子程序的@_这个变量的。
5.子程序中的私有变量
sub max {
my($m,$n); #新的,私有变量
($m,$n) = @_; #赋值 一步:my($m,$n) = @_;
if($m > $n) {$m} else{$n}
}
◆ 这些变量是此代码块中的私有的(或者局部的)变量;别的$m 和$n 不会影响此处的两个变量。而且,其它地方的代码不
能访问或者修改这些变量。
◆在if 代码块内部,其语句没有分号。Perl 允许省略括号中最后一条语句的分号,在实际代码中,通常仅当此代码
块仅包含一条语句时才省略此分号。
6.更好的max程序
$maximum = &max(3,5,10,4,6);
sub max {
my($max_so_far) = shift @_;
foreach (@_){
if($_>$max_so_far){
$max_so_far=$_;
}
}
$max_so_far;
}
如果调用max子程序时参数为空,shift返回undef,foreach循环体一次都不执行,所以子程序返回undef。
7.my变量的注释
① my 操作不会改变赋值参数的context(◆记住,如果没有使用括号,my 仅定义一个变量)
my ($num) = @_; #列表context, 同($sum) = @_;
my $num = @_; #标量context,同$num = @_;
②注意
my $fred, $barney; #错误!没有定义$barney
my ($fred, $barney); #两个均定义了
my @phone_number; 可以使用my 创建新的,私有数组
8.使用strict Pragma
①希望Perl 严格一些;那可以使用strict pragma
②告诉Perl 进行更严格的语法检测,需要在程序顶端use strict #迫使采用更严格的检测
9.省略符号&
①如果编译器在调用之前知道此子程序的定义,或者Perl 从语法中能知道这是一个子程序调用
(◆例如,如果用括号将一些参数括起来,那其为函数调用),则子程序前的符号&是可以省略的
my @cards = shuffle(@deck_of_cards); # &是不必要的
②如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号:
sub division{
$_[0] / $_[1]; #第一个参数除以第二个参数
}
my $quotient = division 355, 113; #可以省略掉括号
③如果子程序和Perl 一个内嵌程序同名,则必须使用&来调用它。编译器将在调用之前检查其定义,而非直接将它当作内嵌的函数来处 理。加上&,可以确保你调用了此子程序;不加,则仅当没有同名的内嵌函数时才能调用到它。
10.非标量返回值
◆ 标量并非子程序返回的唯一类型。如果你在列表context 中调用某个子程序
◆你可以使用wantarray 函数来判断一个子程序是在标量还是列表context 中使用的,这可以让你轻松的写出恰当的子程序。
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)
如果return 后没有任何参数则在标量context 中将返回undef,而在列表context 中将返回空列表。这有助于检验子程序是否返回了正确信息,提示调用者当前不能返回更有意义的值。