子程序也有引用,也有匿名子程序。假设你已经具备了数组、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. 学以致用三十一-----IPAddressField has been removed

    python 和 django版本 在进行makemigrations的时候报错 设置的字段 class Servers(models.Model): '''服务器信息''' hostname = m ...

  2. Cbv源码简单分析图

    重点:cbv源码的简单分析(有后续)

  3. Python序列结构--集合

    集合:元素之间不允许重复 集合属于Python无序可变序列,元素之间不允许重复 集合对象的创建与删除 直接将值赋值给变量即可创建一个集合 >>> a = {3,5}>>& ...

  4. linux之配置Mongodb~

       OK 让我们先下载一波mongodb~(64位ubuntu) curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0. ...

  5. 关于c++的一篇随笔

    众所周知c++是一门极其深奥的学科,正因为其深奥之处,才会让人们觉得学习起来特别难.当然,我想说我自己也不例外,想起当初就像一场噩梦一样,直到今日还历历在目.尽管如此,c++还是一门相当有魅力的课程, ...

  6. Asp.Net WebApi核心对象解析(二)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  7. python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化

    实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...

  8. python爬虫学习之日志记录模块

    这次的代码就是一个日志记录模块,代码很容易懂,注释很详细,也不需要安装什么库.提供的功能是日志可以显示在屏幕上并且保存在日志文件中.调用的方式也很简单,测试代码里面有. 源代码: #encoding= ...

  9. Kali学习笔记36:AVWS10的使用

    AVWS是一款商业Web扫描工具 适用于Windows操作系统 功能强大,必须掌握 AVWS11以上是Web形式,AVWS10是桌面应用形式 下载安装破解这些基本操作就不说了,百度即可 从安装好开始: ...

  10. 页面css样式找不到问题

    出现了一个页面没有样式的问题: 问题: 1.路径不对, 可以打开页面f12看样式是否找到 检查路径是否正确. 2.样式没引全或者没引对. 查看引入的样式是否正确或缺少样式. 3.路径明明写对了却404 ...