Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309416
  • 博文数量: 60
  • 博客积分: 2579
  • 博客等级: 大尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-17 14:54
文章分类

全部博文(60)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(23)

分类:

2008-07-04 20:02:42

名字
   perlsub - Perl 子程序
概要
  子程序申明:
   sub NAME;                     # 前置申明
   sub NAME(PROTO);              #  同上, 带有原型
   sub NAME : ATTRS;             #  带属性
   sub NAME(PROTO) : ATTRS;      #  带属性和原型
   sub NAME BLOCK                # 声明和定义
   sub NAME(PROTO) BLOCK         #  同上带有原型
   sub NAME : ATTRS BLOCK        #  带属性
   sub NAME(PROTO) : ATTRS BLOCK #  带属性和原型
   在运行时定义匿名子程序:
   $subref = sub BLOCK;                 # 不带原型
   $subref = sub (PROTO) BLOCK;         # 带原型
   $subref = sub : ATTRS BLOCK;         # 带属性
   $subref = sub (PROTO) : ATTRS BLOCK; # 带原型和属性
   导出子程序:
   use MODULE qw(NAME1 NAME2 NAME3);
   调用子程序:
   NAME(LIST);    # 带括弧时&是可省略的
   NAME LIST;     # 若子程序预定义或者导出过,括弧可以省略
   &NAME(LIST);   # 带有原型
   &NAME;         # 用当前的@_做子程序的参数
说明
  和很多语言一样,perl提供用户定义的子程序。子程序可能放在主程序中的任意
位置,或者通过"do", "require"或"use"关键字其它文件装载进来,或者在运行时
用"eval"或者匿名子程序生成的。你甚至能通过一个包含例程名字或者代码引用的
变量间接调用一个函数。
 
  perl函数模型调用和返回的值是简单的:所有的函数通过一个标量列表传递参数,
同样地所有的函数返回一个标量列表到调用者。数组或哈希表在这些调用和返回列
表中将被破坏,丢掉他们的标识符。不过你可以用传递引用来避免这种情况。调用
和返回的列表可以包含你想要的标量。(通常一个没有明确返回状态的函数被称为
子程序,从perl的观点来看,这2者没有区别)
   所有被传递的参数被放进@_中。因此,如果你调用一个带2个参数的函数,参数将被
存储在$_[0] 和$_[1]中。数组@_是一个局部变量,数组中的元素是那些实际标量的别名。
特别的,如果$_[0]被更新,对应的参数也将被更新(若不能更新将出错)。如果一个参数
在函数调用时,是一个不存在的数组或者哈希元素,这个元素将被创建仅当它被修改或
者是一个引用。(不管元素是否赋值,perl的一些早期版本创建该元素。)应该将@_赋值给
其他变量,移除那些别名,不要修改任何参数。
   "return"状态可以用来退出一个子程序,随意指定返回值,返回值将被转换在一个
合适的环境(列表,标量或者空),这取决于子程序的调用环境。如果你不指定返回值,
子程序在列表环境下会返回一个空列表,在标量环境下会返回一个未定义的值,或者在
空环境下什么也不返回。如果你返回一个或更多的集合物(数组和哈希表),它们将被放进
一个大的列表中,难于区分。
  如果没有"return",且最后的语句是一个表达式,那么它的值将被返回。如果最后的
语句是一个像"foreach"或者"while"循环控制结构,返回值将是未指定的。空子程序返
回空列表。
  perl没有正式的命名参数。通常你应该把它们赋值给一个"my()"列表。那些没有
申明为私有的变量是全局变量。更多关于创建私有变量的细节,在"Private Variables
via my()"和"Temporary Values vialocal()".为在一个单独的包(可能一个单独的文件)
中的一组函数创建可保护环境,看perlmod中的"Packages"。
    例子:
        sub max {
            my $max = shift(@_);
            foreach $foo (@_) {
                $max = $foo if $max < $foo;
            }
            return $max;
        }
        $bestday = max($mon,$tue,$wed,$thu,$fri);

    例子:
        # get a line, combining continuation lines
        #  that start with whitespace
        sub get_line {
            $thisline = $lookahead;  # global variables!
            LINE: while (defined($lookahead = )) {
                if ($lookahead =~ /^[ \t]/) {
                    $thisline .= $lookahead;
                }
                else {
                    last LINE;
                }
            }
            return $thisline;
        }
        $lookahead = ;       # get first line
        while (defined($line = get_line())) {
            ...
        }
    赋值给一列私有变量来命名函数的参数:
        sub maybeset {
            my($key, $value) = @_;
            $Foo{$key} = $value unless $Foo{$key};
        }
   
    通过参数将参数值赋值的备份,这将使引用的调用转化为值的调用。否则函数将自由
修改@_中元素导致调用者值改变。
        upcase_in($v1, $v2);  # this changes $v1 and $v2
        sub upcase_in {
            for (@_) { tr/a-z/A-Z/ }
        }

 
阅读(1629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~