子程序也有引用,也有匿名子程序。假设你已经具备了数组、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->();
}

很多时候可能希望子程序的执行结果内插到双引号中,这时可以采用技巧"some string @{ [ mysub(arg1,arg2) ] } some string"的方式,将mysub的执行结果放进两端"some string"的中间。这是通过构建匿名列表,然后解除匿名数组实现的,因为数组是可以内插在双引号中的。

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

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

  1. Perl 引用与匿名数组

    写这篇是因为工作遇到一个需要使用列表作为hash的值的问题,这在Python中是非常简单而轻松的事,如下面这段python程序. def add_to_index(index, keyword, ur ...

  2. <1>数据引用与匿名存储

    引用本身就是一种标量变量 引用变量,如 $ra 或$rarray ,就是一种普通的标量变量,因为我们使用"$" 符号. 变量变量可以是一个整数,一个字符串或者一个引用,而且还可以被 ...

  3. Perl解除引用:从引用还原到数据对象

    使用引用可以指向数据对象,这似乎很简单. @name1=qw(longshuai wugui); @name2=qw(xiaofang tuner); $ref_name=\@name1; push ...

  4. Perl文件句柄引用

    目前还没介绍Perl的面向对象,所以这节内容除了几个注意点,没什么可讲的. 以前经常使用大写字母的句柄方式(即所谓的裸字文件句柄,bareword filehandle),现在可以考虑转向使用变量文件 ...

  5. Perl正则表达式引用

    正则表达式两篇: 基础正则 Perl正则 本文是对Perl正则的一点扩展,主要内容是使用qr//创建正则对象,以及一些其它的技巧. qr//创建正则对象 因为可以在正则模式中使用变量替换,所以我们可以 ...

  6. 【java】学习路线4-对象、嵌套引用、匿名对象

    class Learn03_MyClass{    String name = "www.pornhub.com";//成员变量:属性    public void Hello() ...

  7. perl指针引用

    http://bbs.chinaunix.net/forum-viewthread-tid-570031.html

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

    线程简介 线程(thread)是轻量级进程,和进程一样,都能独立.并行运行,也由父线程创建,并由父线程所拥有,线程也有线程ID作为线程的唯一标识符,也需要等待线程执行完毕后收集它们的退出状态(比如使用 ...

  9. Perl系列文章

    0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...

随机推荐

  1. OC内存管理、非ARC机制、MRR机制

    在Xcode里面,默认为ARC(auto reference counting),也就是自动内存管理机制,在这里我们要了解的是内存管理,肯定是不能让系统帮我们管理内存,我们需要将ARC关闭,首先在左边 ...

  2. Js实现继承的方法

    原型的作用:1.将公共部分放入原型中,这样构造出的多个实例对象的公共部分只会占用一个公共空间,实现数据共享和节省内存空间 2.通过原型实现继承:构造函数模拟 "类"这个面向对象的概 ...

  3. day_9内存管理

    复习 '''文件处理​1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...

  4. 无法从项目中获取SSIS包的列表

    一直做的SSIS项目,突然在生成项目的时候没有反应,crtl + alt +o 提示:无法从项目中获取SSIS包的列表,发现是最近的包没有设计数据源, 解决思路:检查最近的包,挨个运行一遍,看看有没有 ...

  5. Java中基本数据和包装类的比较

    public class AutoBoxTest { public static void main(String[] args) { Integer a1 = 127; Integer a2 = 1 ...

  6. 《JavaScript》高级程序设计第21章:Ajax和Comet,jsonp

    一.创建XMLHttpRequest对象 二.XHR的用法 五.跨域资源共享 六.其他跨域技术七.安全七.安全 1. 图像Ping 2. JSONP(JSON with padding,填充式JSON ...

  7. C#通过COM组件操作IE浏览器(三):了解IHTMLDocument2

    IHTMLDocument2方法 说明 write 写入 writeln 写入并换行 open 打开一个流,以收集 document.write 或 document.writeln 的输出 clos ...

  8. 从构建分布式秒杀系统聊聊WebSocket推送通知

    秒杀架构到后期,我们采用了消息队列的形式实现抢购逻辑,那么之前抛出过这样一个问题:消息队列异步处理完每个用户请求后,如何通知给相应用户秒杀成功? 场景映射 首先,我们举一个生活中比较常见的例子:我们去 ...

  9. Android屏幕相关的概念

    1. 屏幕尺寸 实际的物理尺寸,作为屏幕的对角线测量. 为简单起见,安卓所有的实际屏幕尺寸为四个广义的大小:小,正常,大,和特大. 2. 屏幕密度 一个屏幕的物理区域内像素的数量:通常称为DPI(每英 ...

  10. wordpess设置回复可见

    easy2hide 是一个不错的隐藏部分内容,评论后可见的插件,可在插件安装后台搜索 easy2hide 在线安装,或者在此下载 easy2hide. 在编辑文章的时候,切换到html文本编辑模式 测 ...