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->();
}
很多时候可能希望子程序的执行结果内插到双引号中,这时可以采用技巧"some string @{ [ mysub(arg1,arg2) ] } some string"的方式,将mysub的执行结果放进两端"some string"的中间。这是通过构建匿名列表,然后解除匿名数组实现的,因为数组是可以内插在双引号中的。
子程序引用、匿名子程序的最大作用可能是用于回调函数(callback)、闭包(closure)。这个话题有点大,见下一篇文章。
Perl子程序引用和匿名子程序的更多相关文章
- Perl 引用与匿名数组
写这篇是因为工作遇到一个需要使用列表作为hash的值的问题,这在Python中是非常简单而轻松的事,如下面这段python程序. def add_to_index(index, keyword, ur ...
- <1>数据引用与匿名存储
引用本身就是一种标量变量 引用变量,如 $ra 或$rarray ,就是一种普通的标量变量,因为我们使用"$" 符号. 变量变量可以是一个整数,一个字符串或者一个引用,而且还可以被 ...
- Perl解除引用:从引用还原到数据对象
使用引用可以指向数据对象,这似乎很简单. @name1=qw(longshuai wugui); @name2=qw(xiaofang tuner); $ref_name=\@name1; push ...
- Perl文件句柄引用
目前还没介绍Perl的面向对象,所以这节内容除了几个注意点,没什么可讲的. 以前经常使用大写字母的句柄方式(即所谓的裸字文件句柄,bareword filehandle),现在可以考虑转向使用变量文件 ...
- Perl正则表达式引用
正则表达式两篇: 基础正则 Perl正则 本文是对Perl正则的一点扩展,主要内容是使用qr//创建正则对象,以及一些其它的技巧. qr//创建正则对象 因为可以在正则模式中使用变量替换,所以我们可以 ...
- 【java】学习路线4-对象、嵌套引用、匿名对象
class Learn03_MyClass{ String name = "www.pornhub.com";//成员变量:属性 public void Hello() ...
- perl指针引用
http://bbs.chinaunix.net/forum-viewthread-tid-570031.html
- Perl多线程(1):解释器线程的特性
线程简介 线程(thread)是轻量级进程,和进程一样,都能独立.并行运行,也由父线程创建,并由父线程所拥有,线程也有线程ID作为线程的唯一标识符,也需要等待线程执行完毕后收集它们的退出状态(比如使用 ...
- Perl系列文章
0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...
随机推荐
- 【转】像素 Pixel (Picture Element)
原文链接:https://blog.csdn.net/zssureqh/article/details/78768942 1.像素Pixel 讲到概念,首选Wiki百科.当然我说的是英文版Pixel ...
- LoRa与NB-IoT对比(转载)
物联网的基本架构包括三个层面:感知层.网络层和应用层. 物联网架构图 感知层通过传感器采集某些数据(声.光.电等),基于网络层的终端模组,对接到网络层的基站,实现数据采集后的传输. 网络层负责将感知层 ...
- mongodb聚合操作
1. mongodb的聚合是什么 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组.过滤等功能,然后经过一系列的处理 ...
- scrapy的入门使用(二)
1. scrapy实现翻页请求 找到下一页的url地址 构造url地址的请求,传递给引擎 1.1 实现翻页请求 使用方法 在获取到url地址之后,可以通过scrapy.Request(url,call ...
- POJ2947-Widget Factory
工厂里每件期间的生产时间为3-9天,告诉你有N个器件和M个计划,每个计划都是说明生产1-N号器件的时间,最后问你每件器件的生产时间.或者多解或没有解. 例如样例 2 3 2 MON THU 1 2 3 ...
- PowerPoint 2013中创建自定义路径动画的方法
1.在幻灯片中选择对象,在“动画”选项卡的“高级动画”组中单击“添加动画”按钮,在打开的下拉列表中选择“自定义路径”选项,如图1所示. 图1 选择“自定义路径”选项 2.此时鼠标指针变为十字形,在幻灯 ...
- Linux命令中:rsync和scp之间的区别
scp是把文件全部复制过去,当文件修改后还是把所有文件复制过去, rsync 第一次是把所有文件同步过去,当文件修改后,只把修改的文件同步过去 rsync -av 10.251.205.8:/usr1 ...
- Maven 在新版eclipse报错的解决
转自Stack Overflow Remove all your failed downloads: Linux: find ~/.m2 -name "*.lastUpdated" ...
- CentOS7设置固定IP
在安装完CentOS7后,当我每次启动CentOS并使用SecureCRT链接时,都发现CentOS的IP总是在变,这就很苦恼了,总不能每次链接的时候都先查一下虚拟机的IP吧,所以打算把它设置成固定I ...
- 初识KNN
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...