Perl子程序(函数)和引用

Perl子程序(函数)

Perl子程序也就是用户自定义的函数

Perl子程序可以出现在程序的任何地方,语法格式如下:

sub subroutine{

  statements;

}

调用子程序语法格式: subroutine( 参数列表 );

在Perl5.0以下版本调用子程序方法如下:&subroutine( 参数列表 );

向子程序传递参数

Perl子程序可以和其他编程一样接受多个参数,子程序参数使用特殊数组@_表明。因此子程序第一个参数为$_[0], 第二个参数为$_[1],以此类推。

不论参数是标量型还是数组型的,用户把参数传给子程序时,perl默认按引用的方式调用。

用户可以通过改变@_数组中的值来改变相应实际参数的值。

向子程序传递列表

由于@_变量是一个数组,所以它可以向子程序中传递列表。

但如果需要传入标量和数组参数时,需要把列表放在最后一个参数上。我们可以向子程序传入多个数组和哈希,但是在传入多个数组和哈希时,会导致丢失独立的标识。所以我们需要使用引用。

向子程序传递哈希

当向子程序传递哈希时,它将复制到@_中,哈希表将被展开为键/值组合的列表。

子程序返回值

子程序可以向其他编程语言一样使用 return语句来 返回函数值。

如果没有使用return语句,则子程序的最后一行语句 将作为返回值。

子程序的私有变量

默认情况下,Perl中所有的变量都是全局变量,也就是说变量在程序的任何地方都可以调用。如果需要设置私有变量,可以使用my操作符来设置。

my操作符用于创建作用域变量,通过my创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。

闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个 if, while, for, foreach, eval字符串。

实例:

实例

变量的临时赋值

可以使用local为全局变量提供临时的值,在退出作用域后将原来的还原。

local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中。定义时可以给其赋值。

实例

静态变量

state操作符功能类似于static修饰符,state关键字将局部变量变得持久。state也是词法变量,所以只在定义该变量 的词法作用域中有效。

实例

1. state仅能创建闭合作用域为子程序内部的变量

2. state是从Perl 5.9.4开始引入的,所以使用前必须加上use

3. state可以声明标量,数组,哈希。但在声明数组 和哈希时,不能对它初始化。

子程序调用上下文

子程序调用过程中,会根据上下文来返回不同类型的值,比如以下 localtime() 子程序,在标量上下文返回字符串,在列表上下文返回列表:

Perl引用

引用就是指针,Perl引用是一个标量类型可以指向变量,数组,哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。

创建引用

定义变量的时候,在变量名前面加个\,就得到了这个变量的引用

实例

在数组中我们可以用匿名数组引用,使用 [] 定义:

$aref= [ 1,"foo",undef,13 ];

匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组,可以构造任意维度的数组。

my $aref = [

        [1, 2, 3],

        [4, 5, 6],

        [7, 8, 9],

]

在哈希中我们可以用匿名哈希引用,使用 {} 定义:

$href= { APR =>4, AUG =>8 };

我们也可以创建一个没有子程序名的匿名子程序引用:

$coderef = sub { print "W3CSchool!\n" };

取消引用

取消应用可以根据不同的类型使用 $, @ 或 % 来取消

实例:

实例

如果不能确定变量类型,可以使用ref来判断,返回列表如下:

实例:

循环引用

循环引用在两个引用相互包含时出现。需要小心使用,不然会导致内存泄漏

实例

引用函数

函数引用格式:\&

调用引用函数格式: & + 创建的引用名

实例
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • Perl 子程序(函数) Perl 子程序也就是用户定义的函数。 Perl 子程序即执行一个特殊任务的一段分离的代...
    木易林1阅读 302评论 0 0
  • 定义子程序 Perl中有许多内置的系统函数,如chomp、sort、print等,每一个这样的函数都可以实现各种不...
    樱雨楼阅读 587评论 0 0
  • 2009 有用的和有意思的循环 让我们来看一个基本的例子. 这是一个最简单清晰的语法的例子.在这并没有使用括号来包...
    焉知非鱼阅读 553评论 0 0
  • Perl 子程序也就是用户定义的函数。Perl 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使...
    oddxix阅读 802评论 0 0
  • 我是张夏艳,我是樊登读书会漳州分会的执行会长,我也是两个孩子的妈妈,我希望每篇文章都能给你赋能,这是我2018年每...
    张夏艳阅读 560评论 0 1