Perl 学习笔记-子程序

1.定义子程序 

  使用sub关键字定义 ;   子程序名和标识符同要求, 但是有的特殊的可以用 &符号;  子程序是全局的, 不需要再使用前声明;  重名函数后者覆盖前者.

sub roger{
    $n += 1; #全局变量$n
    print "Hello , sailor number $n!\n";
}
&roger  # 前面加&来调用, 不过没加好像也能调用.

  返回值: 在子程序执行过程中会不断运算, 而最后一次运算的结果(不管是什么)都会被当成子程序的返回值.  最后一行作为返回值可以省略逗号

2.Perl函数参数

  参数传递: Perl维护一个特殊数组变量 @_  , 这个变量在子程序执行期间有效, 子程序可以访问这个数组, 递归调用会有各自的 @_ , 因为Perl会自动保存和恢复

  使用:  使用  $_[index] 来进行访问, 就想对一个数组  @roger , 可以使用  $roger[0] 来访问 @roger 的第一个元素一样, 可能是内部规定吧; 如果使用  @_[index] 访问也能得到正确结果, 但是会得到一个警告:  Scalar value @_[0] better written as $_[0]

  Perl中所有的变量都是全局变量,  在程序的任何地方都能访问它们,  但是随时可以使用(不仅仅是在子程序中) my 操作符(也称为词法变量)来创建私有的变量.  参数变量 @_ 就是子程序的默认私有变量.  特殊情况: 使用  &subname  调用子程序, 并且没有参数时, @_ 会从上下文中继承下来.

sub max{
    my($m,$n) = @_;
    if($m > $n){$m}else{$n}
}
print &max(1,2)

  my操作符会不改变赋值时的上下文;  不带括号时只能作用于一个变量, 多个变量要用 my()

@t = (1,2,3);
my($roger) = @t;  # 列表上下文
my $r = @t; # 标量上下文
print $roger;   # 1
print $r;  # 3

3. return操作符

  虽然在子程序中可以不用return进行返回(默认返回最后一次计算结果), 但是可以用return立即返回;  单写一个return,不给任何参数, 在标量上下文中返回undef, 在列表上下文中返回空列表.

4. 子程序调用省略 & 号

  如果编译器在调用子程序之前看到了子程序的定义, 或者Perl可以从语法识别它是子程序调用, 那么子程序据可以像内置函数一样在调用时直接使用名字. 但是建议都加上 & , 避免与内置函数重名.

sub mycount{
    if($a < $b){ #访问全局变量
        $a .. $b
    }else{
        reverse $b .. $a
    }
}
$a = 10; # 在函数调用之前赋值
$b = 2;
print &mycount

5.持久性私有变量--使用state操作符

# 使用全局变量的情况
sub roger {
    $n += 1;  #每次调用都会讲全局变量 $n 增加1, 第一次使用的时候没有说明$n是全局变量, 但是根据结果可以知道在子程序里面定义的也是全局变量
}
for($i=0;$i<10;++$i){
    &roger()
}
print "$n\n";
# 使用私有变量的情况
use 5.010;
sub roger {
    state $n = 0; # 持久性私有变量 $n
    $n += 1;
}
for($i=0;$i<10;++$i){
    print &roger();  #输出 1 .. 10, 使变量在第一次调用roger()函数结束之后仍然保留,而如果用my就会被销毁
    printf("\n");
}
print $n;  # undef

  注意: 在 5.010中不能在列表上下文中初始化以下类型的state变量  state @array = qw(a b c); # wrong!

时间: 2024-11-02 18:43:45

Perl 学习笔记-子程序的相关文章

Perl学习笔记(一)--简介

1. 查看当前所用Perl版本号 ? 1 perl –v 2.  一个简单的Perl程序 ? 1 2 3 print "hello world"; #这是注释 执行它: ? 1 Perl helloWorld.txt 文件名后缀可以是pl可以是txt 3. 一个稍微复杂点的Perl程序 ? 1 2 3 4 5 6 @line = `perldoc -u -f atan2`; //运行一个外部命令,通过反引号来调用,将输出结果一行行依次存储在@line这个数组变量中 foreach(@l

perl学习笔记--搭建开发环境

windows下perl开发环境搭建 perl下载地址:http://www.activestate.com/developer-tools 各个插件的安装方法:(通过代理上网的方法) 方法一:padwalker的安装步骤 1. padwalker下载地址: http://www.bribes.org/perl/ppm/ 2. 解压下载的文件 4. 拷贝 blib/lib/PadWalker.pm 到 Perl/lib(你的安装路径)5. 拷贝 blib/arch/auto/PadWalker

PERL学习笔记---正则表达式的应用

使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以 不区分大小写:/i if(/yes/i) {#大小写无关 print “In that case, I recommend that you go bowling.\n”;} 匹配任何字符:/s 默认情况下,点(.)不匹配换行符,这

perl学习之子程序

一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调用调用方法如下:1.用&调用&subname;...sub subname{...}2.先定义后调用 ,可以省略&符号sub subname{...}...subname;3.前向引用 ,先定义子程序名,后面再定义子程序体sub subname;...subname;...sub su

Perl学习笔记(四)--子程序

定义子程序: 要定义自己的子程序,可使用关键字sub,子程序名(不包含与号)以及用花括号封闭起的代码块,例如: 1 sub marine{ 2 $n +=1; #全局变量 $n 3 Print “Hello,sailor number $n \n”; 4 } 子程序不需要事先声明 子程序的定义是全局的,不存在私有子程序 假如定义两个重名的子程序,后面的子程序会覆盖掉前面的那个 调用子程序 1 &marine; 返回值 子程序中最后一次运算的结果都会被自动当成子程序的返回值 参数 要传递参数列表到

Perl 学习笔记-标量数据

最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值,所有数字的内部格式都相同,采用"双精度浮点数"运算,自动转换.范围值(1e-100到 1e100) 2. 可以在一个很大的数中间插入下划线,便于阅读: 61_298_040_283_768,在取模运算时,如果其中一边或两边都是负数,则不同的Perl版本可能会有不同结果.不能计算负数的负数次方,因为会得到复数,

Perl 学习笔记

Note I:子程序的基本应用1 1 #!/usr/bin/perl -w 2 3 use 5.018; 4 5 sub total 6 { 7 my $res; 8 foreach (@_) 9 { 10 $res += $_; 11 } 12 $res; 13 } 14 15 my @list; 16 my $cur; 17 while ($cur = <STDIN>) 18 { 19 chomp $cur; 20 push @list, $cur; 21 } 22 my $sum; 23

Perl 学习笔记-高级控制结构

1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码;  unless(<condition>){code...;} 等价于  if(<condition>){}else{code...;}  也就是当条件为假是执行. unless (0) { print "Hello"; #Hello } 2. until控制结构 until就是改装过的while, 区别在于它在条件为假是执行代码块. $i = 2;$j = 10; u

perl学习笔记之:模式匹配,模块,文档

Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正则表达式与模式匹配的特点一是内嵌于语言之中,而不是通过库或函数来实现,因此使用更简便:二是比一般的正则表达式与模式匹配功能强大. 模式匹配操作符简介 操作符 意义 实例 =~ 匹配(包含) !~ 不匹配(不包含) m// 匹配 $haystack =~ m/needle/ $haystack =~