《Perl语言入门》第四章 子程序

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 中将返回空列表。这有助于检验子程序是否返回了正确信息,提示调用者当前不能返回更有意义的值。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值