Perl子程序引用和匿名子程序

子程序也有引用,也有匿名子程序。假设你已经具备了数组、hash的引用知识,所以这里简单介绍一下。

$ref_sub = \&mysub;      # 子程序引用,&符号必须不能少
&{$ref_sub}(ARGS)        # 解除子程序引用,传递参数ARGS
&$ref_sub(ARGS)          # 解除子程序引用
$ref_sub->(ARGS)         # 解除子程序引用
$ref_sub->()             # 传递空参数

sub {...};               # 定义匿名子程序,sub后面没有名称
$ref_sub = sub {...};    # 匿名子程序的引用

有了子程序引用,就可以按需调用子程序。

例如:

sub java_learn {
    print "Learning Java now\n";
}
sub perl_learn {
    print "Learning Perl now\n";
}
sub python_learn {
    print "Learing Python now\n";
}

%sub_hash=(
    "javaer"   => \&java_learn,
    "perler"   => \&perl_learn,
    "pythoner" => \&python_learn,
);

while(my ($who,$sub)=each %sub_hash){
    print "$who is learning\n";
    $sub->();
}

改成匿名子程序:

$javaer = sub {
    print "Learning Java now\n";
};
$perler = sub {
    print "Learning Perl now\n";
};
$pythoner = sub {
    print "Learing Python now\n";
};

foreach (qw(javaer perler pythoner)){
    print "$_ is learning\n";
    $$_->();
}

甚至,将匿名子程序作为数据结构的一部分:

%sub_hash = (
    "javaer" => sub {
        print "Learning Java now\n";
    },
    "perler" => sub {
        print "Learning Perl now\n";
    },
    "pythoner" => sub {
        print "Learning Python now\n";
    },
);

while( my($who,$sub)=each %sub_hash ){
    print "$who is learning\n";
    $sub->();
}

子程序引用、匿名子程序的最大作用可能是用于回调函数(callback)、闭包(closure)。这个话题有点大,见下一篇文章。

原文地址:https://www.cnblogs.com/f-ck-need-u/p/9733283.html

时间: 2024-10-19 06:00:01

Perl子程序引用和匿名子程序的相关文章

C++中引用和匿名对象的理解和本质剖析

引用是什么? 引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别. 那什么又是变量名呢? 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间. 也可以这样理解,变量名是逻辑概念,变量是物理层面,变量含数据类型和数据值,数据类型决定内存的分配,编译器将变量名和变量对应的内存联系起来,使程序员可以通过变量名来操作内存. 引用怎么用?    语法:Type& name = var; 规则:1.普通引用在

Perl正则表达式引用

正则表达式两篇: 基础正则 Perl正则 本文是对Perl正则的一点扩展,主要内容是使用qr//创建正则对象,以及一些其它的技巧. qr//创建正则对象 因为可以在正则模式中使用变量替换,所以我们可以将正则中的一部分表达式事先保存在变量中.例如: $str="hello worlds gaoxiaofang"; $pattern="w.*d"; $str =~ /$pattern/; print "$&\n"; 但是,这样缺陷很大,在保存

Perl多线程(1):解释器线程的特性

本文关于Perl线程的内容初始主要来自于<Pro Perl>的第21章,未来可能会逐渐添加.完善更多内容,当然也可能分离一部分内容单独成文. 线程简介 线程(thread)是轻量级进程,和进程一样,都能独立.并行运行,也由父线程创建,并由父线程所拥有,线程也有线程ID作为线程的唯一标识符,也需要等待线程执行完毕后收集它们的退出状态(比如使用join收尸),就像waitpid对待子进程一样. 线程运行在进程内部,每个进程都至少有一个线程,即main线程,它在进程创建之后就存在.线程非常轻量级,一

Perl的子程序

子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修改全局变量,这和几乎所有的语言都不同.当然,也可以定义局部变量 perl中使用&SUB_NAME()的方式调用SUB_NAME子程序,&有时候可以省略,括号有时候也可以省略.具体的规则见后面 sub mysub { $n += 1; print "\$n is: $n",&

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

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

Perl 学习笔记-子程序

1.定义子程序 使用sub关键字定义 ;   子程序名和标识符同要求, 但是有的特殊的可以用 &符号;  子程序是全局的, 不需要再使用前声明;  重名函数后者覆盖前者. sub roger{ $n += 1; #全局变量$n print "Hello , sailor number $n!\n"; } &roger # 前面加&来调用, 不过没加好像也能调用. 返回值: 在子程序执行过程中会不断运算, 而最后一次运算的结果(不管是什么)都会被当成子程序的返回值

[Perl系列—] 2. Perl 中的引用用法

Perl 中的引用,为什么要使用引用? 对于熟悉C语言的开发者来说, 指针这个概念一定不陌生. Perl 的引用就是指针,可以指向变量.数组.哈希表甚至子程序. Perl5中的两种Perl引用类型为硬Perl引用和符号Perl引用.符号Perl引用含有变量的名字,它对运行时创建变量名并定位很有用,基本上,符号Perl引用就象文件名或UNIX系统中的软链接.而硬Perl引用则象文件系统中的硬链接. Perl4只允许符号Perl引用,给使用造成一些困难.例如,只允许通过名字对包的符号名哈希表(名为_

perl5 第八章 子程序

第八章 子程序 by flamephoenix 一.定义二.调用  1.用&调用  2.先定义后调用  3.前向引用  4.用do调用三.返回值四.局部变量五.子程序参数传递  1.形式  2.传送数组六.递归子程序七.用别名传递数组参数八.预定义的子程序 一.定义   子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:  sub subroutine{    statements;  }二.调用   调用方法如下

PL/SQL子程序

一般来说过程和函数被称为子程序.过程是一段不具有返回值的代码块,而函数会返回一个值.子程序与匿名块的最大不同是它们可以存储到数据库的字典中,以便重用. 向dept表插入记录的过程 create or replace procedure newdept( p_deptno dept.deptno%TYPE, p_dname  dept.dname%TYPE, p_loc    dept.loc%TYPE ) AS v_deptcount NUMBER; begin select count(*)