perl学习(4) 子程序
子程序,类比c语言中的函数,在形式上个人认为最大的区别:没有形参
1.1.定义子程序
1.2.调用
|
#! /usr/bin/perl sub marine { $n += 1 ; print "$n\n" ; } &marine; &marine; |
1.3.返回值
1.3.1. 基本原则
所有的Perl 子程序都会返回值,在Perl 中返回值和不返回值是没有区别的。当然,不是所有Perl子程序返回的值都是有用的。
由于所有的被调用的子程序都要返回值,因此使用特殊的返回值语法在大多数情况下是一种浪费。因此Larry将之简化了。当Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。
|
#! /usr/bin/perl $num1 = 10 ; $num2 = 20 ; sub marine { $n += 1 ; print "$n\n" ; $num1 + $num2 ; } &marine; &marine; print 1 + &marine,"\n" ; |
所有的函数都会有返回值:
,意思是“print was succfessful(打印成功)”
1.3.2. return
直接调用return情况也是有的
|
#! /usr/bin/perl use strict ; my @names = qw /fred barney betty dinoWilma pebbles bam-bamm/; my $result = &which_element_is("dino", @names); print $result ,"\n"; my $result = &which_element_is("betty", @names); print $result ,"\n"; # sub which_element_is { my($what, @array) = @_; foreach(0..$#array){ #@array元素的索引 if($what eq $array[$_]){ return $_; #找到既返回 } } -1; #没有找到元素(此处是可选的) } |
1.3.3. 返回列表
1.4.参数
个参数
此参数列表被传到子程序中,这些参数可以被子程序使用。当然,这些参存放在某个地方,在Perl中,会自动将此参数列表(此参数列表的另一个名字)自动存放在一个叫做@_的数组中。子程序可以访问次数组变量来确定此参数的个数以及其值,子程序参数的第一个值存放在$_[0]中,第二个存放在$_[1],依次类推。
Perl 不会关心是否有多余的变量。参数不够时也会被忽略,当传入的参数个数不够时,不够的参数会得到undef这个值。
@_是子程序的一个私有变量,如果有一个全局变量@_,它将在此子程序调用前存储起来,当子程序调用完成后,其早期的值会被重新赋还给@_。这意味着当将参数传递给子程序时不用担心它会影响此程序中其它子程序的@_这个变量的值。
嵌套的子程序调用时,@_的值和上述类似。甚至此子程序递归调用时,每一次调用将得到新的@_,因此子程序调用时将得到其自身的参数列表。
注意:
调用的子程序没有参数时,此时@_从此调用者的上下文(context)得到。这通常不是个好主意,但有时很有用。
在调用子程序时,参数会在子程序中被修改。
|
#! /usr/bin/perl $num1 = 10 ; $num2 = 20 ; sub marine { $n += 1 ; print "$n\n" ; $num1 + $num2 ; $_[0] += 20 ; } &marine; &marine; print 1 + &marine,"\n" ; $arg = 10 ; &marine($arg) ; print $arg ,"\n"; |
更高级的max,可以不用限制参数个数
|
$maximum = &max(3,5,10,4,6); sub max { my($max_so_far) = shift @_; foreach (@_){ if($_>$max_so_far){ $max_so_far=$_; } } $max_so_far; } |
1.5.子程序私有变量
使用my创建私有变量:
sub max {
my($m,$n) = @_; #局部变量赋值
if($m > $n) {$m} else{$n}
}
个变量,在此子程序中分别被叫做$m和$n。
1.6.strict pragrma
在程序顶端use strict(或者在任意块或者文件中,如果你需要在此部分使用它),Perl进行更严格的语法检测。
许多人推荐如果程序长度大于一个屏幕,则需要使用use strict
perl学习(4) 子程序的更多相关文章
- perl学习之子程序
一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调 ...
- Perl 学习笔记-子程序
1.定义子程序 使用sub关键字定义 ; 子程序名和标识符同要求, 但是有的特殊的可以用 &符号; 子程序是全局的, 不需要再使用前声明; 重名函数后者覆盖前者. sub roger{ ...
- perl学习之:use and require
本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域 ...
- perl学习之路1
一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...
- perl 学习笔记
一:基础 1:安装perl centos: yum -y install perl 官网:https://www.perl.org/ 升级到5.22:先下载,执行./i ...
- Perl 学习笔记-高级控制结构
1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码; unless(<condition>){code...;} 等价于 if(<con ...
- Perl 学习笔记-标量数据
最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ...
- perl学习笔记三
子程序 定义子程序(可以在程序的任意位置) 关键字sub.子程序名(不包含与号)以及用花括号封闭起来的代码快. 如:sub marine{ $n+=1; print "hello,sailo ...
- perl学习之:函数总结
一.进程处理函数 1.进程启动函数 函数名 eval 调用语法 eval(string) 解说 将string看作Perl语句执行.正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息. 例子 ...
随机推荐
- Cocos2d-x:环境配置小节
一.准备 须要下载下面内容. 1. vs2010 下载地址:http://download.microsoft.com/download/1/4/3/143B7583-6225-474F-88D5-5 ...
- struts2入门
好久没有动博客了.今天看了一下慕课网的视频,简单了解一下struts2. 首先是在项目中引入struts2的文件,有一个比较简单的方法就是可以直接右键项目MyEclipse->Project f ...
- JavaSE_ Java基础 总目录(1~6)
JavaSE学习总结第01天_Java概述01.01 计算机概述01.02 计算机硬件和软件概述01.03 软件开发和计算机语言概述01.04 人机交互01.05 键盘功能键和快捷键01.06 如何打 ...
- 条款16:成对使用new和delete时,采取相同的形式
问题聚焦: 我们都知道,new和delete要成对使用,但是有时候,事情往往不是按我们预期的那样发展. 对于单一对象和对象数组,我们要分开考虑. 遇到typedef时,也需要搞 ...
- [cocos2d-x] 让精灵响应触摸 并把方向旋转到相对应的角度
在cocos2d-x里面 想要把一个精灵从原位置移动到用户所触摸到的点 , 并且把精灵的方向旋转相对应的弧度,可以参考一下我的做法 我这里的精灵是用一条鱼, 用户触摸后鱼就移动到所触摸的点, 并且移 ...
- hdu 4349 Xiao Ming's Hope lucas
题目链接 给一个n, 求C(n, 0), C(n, 1), ..........C(n, n)里面有多少个是奇数. 我们考虑lucas定理, C(n, m) %2= C(n%2, m%2)*C(n/2 ...
- Sublime Text3安装SublimeREPL插件以及快捷键设置
SublimeREPL是Sublime Text的一个插件,它除了可以使你在ST中运行解释器(REPL),还有对Python语言的特别支持,包括在本地/远程(远程仅在linux/osx平台可用)vir ...
- IOS 表视图(UITableVIew)的使用方法(6)表视图的编辑功能(新增Add)
表视图的新增功能和删除功能虽然目的不同,但是工作流程是相似的 下面列出在处理新增的回调函数时,与删除所不同的逻辑部分代码. 显示下过如下: #pragma mark #pragma mark Tabl ...
- Springmvc异步上传文件
<script src="js/jquery.js" type="text/javascript"></script><scrip ...
- OSG项目经验2<在场景中添加文字面版>
添加文字版需要用到osg的三个名字空间: osgText::Text,这个类用来添加文字和设置文字的一些属性: ...