Perl 学习笔记-子程序
1.定义子程序
使用sub关键字定义 ; 子程序名和标识符同要求, 但是有的特殊的可以用 &符号; 子程序是全局的, 不需要再使用前声明; 重名函数后者覆盖前者.
sub roger{
$n += ; #全局变量$n
print "Hello , sailor number $n!\n";
}
&roger # 前面加&来调用, 不过没加好像也能调用.
返回值: 在子程序执行过程中会不断运算, 而最后一次运算的结果(不管是什么)都会被当成子程序的返回值. 最后一行作为返回值可以省略逗号
2.Perl函数参数
参数传递: Perl维护一个特殊数组变量 @_ , 这个变量在子程序执行期间有效, 子程序可以访问这个数组, 递归调用会有各自的 @_ , 因为Perl会自动保存和恢复
使用: 使用 $_[index] 来进行访问, 就想对一个数组 @roger , 可以使用 $roger[] 来访问 @roger 的第一个元素一样, 可能是内部规定吧; 如果使用 @_[index] 访问也能得到正确结果, 但是会得到一个警告: Scalar value @_[] better written as $_[]
Perl中所有的变量都是全局变量, 在程序的任何地方都能访问它们, 但是随时可以使用(不仅仅是在子程序中) my 操作符(也称为词法变量)来创建私有的变量. 参数变量 @_ 就是子程序的默认私有变量. 特殊情况: 使用 &subname 调用子程序, 并且没有参数时, @_ 会从上下文中继承下来.
sub max{
my($m,$n) = @_;
if($m > $n){$m}else{$n}
}
print &max(,)
my操作符会不改变赋值时的上下文; 不带括号时只能作用于一个变量, 多个变量要用 my()
@t = (,,);
my($roger) = @t; # 列表上下文
my $r = @t; # 标量上下文
print $roger; #
print $r; #
3. return操作符
虽然在子程序中可以不用return进行返回(默认返回最后一次计算结果), 但是可以用return立即返回; 单写一个return,不给任何参数, 在标量上下文中返回undef, 在列表上下文中返回空列表.
4. 子程序调用省略 & 号
如果编译器在调用子程序之前看到了子程序的定义, 或者Perl可以从语法识别它是子程序调用, 那么子程序据可以像内置函数一样在调用时直接使用名字. 但是建议都加上 & , 避免与内置函数重名.
sub mycount{
if($a < $b){ #访问全局变量
$a .. $b
}else{
reverse $b .. $a
}
}
$a = ; # 在函数调用之前赋值
$b = ;
print &mycount
5.持久性私有变量--使用state操作符
# 使用全局变量的情况
sub roger {
$n += ; #每次调用都会讲全局变量 $n 增加1, 第一次使用的时候没有说明$n是全局变量, 但是根据结果可以知道在子程序里面定义的也是全局变量
}
for($i=;$i<;++$i){
&roger()
}
print "$n\n";
# 使用私有变量的情况
use 5.010;
sub roger {
state $n = ; # 持久性私有变量 $n
$n += ;
}
for($i=;$i<;++$i){
print &roger(); #输出 1 .. 10, 使变量在第一次调用roger()函数结束之后仍然保留,而如果用my就会被销毁
printf("\n");
}
print $n; # undef
注意: 在 5.010中不能在列表上下文中初始化以下类型的state变量 state @array = qw(a b c); # wrong!
Perl 学习笔记-子程序的更多相关文章
- perl学习(4) 子程序
子程序,类比c语言中的函数,在形式上个人认为最大的区别:没有形参 1.1.定义子程序 1.2.调用 #! /usr/bin/perl sub marine { $n += 1 ; print &quo ...
- perl学习之子程序
一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调 ...
- Perl 学习笔记-标量数据
最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在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语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...
- perl学习笔记三
子程序 定义子程序(可以在程序的任意位置) 关键字sub.子程序名(不包含与号)以及用花括号封闭起来的代码快. 如:sub marine{ $n+=1; print "hello,sailo ...
- perl学习笔记之:模式匹配,模块,文档
Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...
- perl学习笔记
一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...
随机推荐
- java多线程(1) 线程的基本概念
一.线程的基本概念: 线程是一个程序里面不同的执行路径. 程序里面不同的执行路径,每一个分支都是一个线程. 进程:静态的概念.机器上的一个class文件,机器上的一个exe文件,这叫一个进程. 机 ...
- Lamp 安装教程
Ubuntu 14.04 麒麟版安装:Apache+php5+mysql+phpmyadmin. LAMP是Linux web服务器组合套装的缩写,分别是Linux+Apache+MySQL+PHP. ...
- Linux常用命令英文缩写
命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 (ubuntu 使用管理员权限 是 sudo) rpm ...
- C++ 单链表操作总结
第一.单链表的定义和操作 #include <iostream> using namespace std; template <typename T> struct Node ...
- solr解决访问安全
Tomcat7,solr3.6,mmseg1.8 1:环境的搭建 1:解压tomcat,solr,mmseg4j 2:复制dist文件夹下apache-solr.war到tomcat的webapp文件 ...
- Http中Cookie的HttpOnly和secure属性
Cookie语法: Cookie通常是作为HTTP 应答头发送给客户端的,下面的例子展示了相应的语法(注意,HttpOnly属性对大小写不敏感): Set-Cookie: =[; =] [; e ...
- Tkinter Frame(框架)
Tkinter Frame(框架): 框架构件在某种友好的方式进行分组和组织的其他部件的过程中是非常重要的.它就像一个容器,这是负责安排其他部件的位置 框架构件在某种友好的方式进行分组和组织 ...
- select to object 查询方法
(1)Select() (2)Where() (3)OrderBy()
- 使用Dottrace跟踪.net代码执行时间
当程序遇到性能问题,如IIs请求反应缓慢,.net客户端程序执行缓慢,如何分析是哪里出了问题?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,清晰的看出是哪里执行时间过长,然后再分 ...
- Django templates 和 urls 拆分
如果在Django项目 下面新建了blog和polls两个APP应用,在每个APP下面都各自新建自己的url和templates,那么我们需要如何进行项目配置呢? INSTALLED_APPS = [ ...