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 学习笔记-子程序的更多相关文章

  1. perl学习(4) 子程序

    子程序,类比c语言中的函数,在形式上个人认为最大的区别:没有形参 1.1.定义子程序 1.2.调用 #! /usr/bin/perl sub marine { $n += 1 ; print &quo ...

  2. perl学习之子程序

    一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调 ...

  3. Perl 学习笔记-标量数据

    最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ...

  4. perl 学习笔记

    一:基础 1:安装perl      centos: yum -y install perl       官网:https://www.perl.org/      升级到5.22:先下载,执行./i ...

  5. Perl 学习笔记-高级控制结构

    1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码;  unless(<condition>){code...;} 等价于  if(<con ...

  6. Perl 学习笔记-列表和数组

    笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...

  7. perl学习笔记三

    子程序 定义子程序(可以在程序的任意位置) 关键字sub.子程序名(不包含与号)以及用花括号封闭起来的代码快. 如:sub marine{ $n+=1; print "hello,sailo ...

  8. perl学习笔记之:模式匹配,模块,文档

    Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...

  9. perl学习笔记

    一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...

随机推荐

  1. 【转】Jmeter入门:如何建立和使用Jmeter测试环境

    一.工具描述 apache jmeter是100%的java桌面应用程序,它被设计用来加载被测试软件功能特性.度量被测试软件的性能.设计jmeter的初衷是测试web应用, 后来又扩充了其它的功能.j ...

  2. Java-Runoob-高级教程:Java 数据结构

    ylbtech-Java-Runoob-高级教程:Java 数据结构 1.返回顶部 1. Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举 ...

  3. Java-Runoob:Java 数组

    ylbtech-Java-Runoob:Java 数组 1.返回顶部 1. Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言 ...

  4. linux文件权限,用户和组

    文件权限 默认权限分配 umask umask是通过八进制的数值来定义用户创建文件或目录的默认权限的 安全权限的临界点是,文件默认权限是644,目录默认权限是755 [root@Poppy joker ...

  5. Centos 7.0 下安装 Zabbix server 3.0服务器的安装及 监控主机的加入(1)

    一.本系列分为6部分 1.Centos 7.0 下安装 Zabbix server 3.0服务器的安装及 监控主机的加入 2.Centos 6.5 下安装 Zabbix server 3.0服务器的安 ...

  6. angularJS开发碰到的问题

    bootstarp css无法加载 http://stackoverflow.com/questions/27656503/how-to-make-yo-angular-load-bootstrap- ...

  7. Protobuf3教程

    Protobuf3教程 https://blog.csdn.net/hulinku/article/details/80827018 Protobuf语言指南——.proto文件语法详解 https: ...

  8. swoole学习

    <?php ini_set('default_socket_timeout', -1); class serverEmail { public $serv = null; public func ...

  9. WEB服务重要基础

    1.1用户访问房展基本流程 我们每天都会使用Web客户端上网浏览网页.最常见Web客户端就是Web浏览器,如通过的微软InternetExplorer(IE)以及技术人员偏爱的火狐浏览器.谷歌浏览器等 ...

  10. 解决oracle11g无法导出空表问题

    11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...