子程序,类比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) 子程序的更多相关文章

  1. perl学习之子程序

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

  2. Perl 学习笔记-子程序

    1.定义子程序 使用sub关键字定义 ;   子程序名和标识符同要求, 但是有的特殊的可以用 &符号;  子程序是全局的, 不需要再使用前声明;  重名函数后者覆盖前者. sub roger{ ...

  3. perl学习之:use and require

    本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域 ...

  4. perl学习之路1

    一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...

  5. perl 学习笔记

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

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

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

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

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

  8. perl学习笔记三

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

  9. perl学习之:函数总结

    一.进程处理函数 1.进程启动函数 函数名 eval 调用语法 eval(string) 解说 将string看作Perl语句执行.正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息. 例子 ...

随机推荐

  1. 微信jsapi支付的坑

    1.显示 redirect_uri 参数错误  因为手机支付是需要微信授权的,所以检查配置授权域名地址是否正确填写(登陆微信公众平台,地址:https://mp.weixin.qq.com/cgi-b ...

  2. javascript 的工具方法 --- 类型判断

    Javascript中常见类型对象有: Boolean, Number, String, Function, Array, Date, RegExp, Object, Error, Symbol等等. ...

  3. ExtJs004define定义类

    Ext.onReady(function () { //在Ext中如何去定义一个类: Ext.define(className , properties , callback) Ext.define( ...

  4. MVC-05 Model(2)

    五.使用Code First数据库迁移 当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常 ...

  5. Protel中放置汉字工具的使用图示

    首先先到网上下载Protel中放置汉字工具ProtelHz.然后把ProtelHz中的文件全部解压到Protel99se安装目录X:\Program Files\Design Explorer 99 ...

  6. Jass 技能模型定义(转)

    Jass是什么?       先阐释一下什么是jass吧,百度:JASS(正确地说是JASS 2)是魔兽3的程序语言,用于控制游戏和地图的进行,也是魔兽游戏和地图的基础. 地图编辑器中摆放的单位(Un ...

  7. 过拟合/欠拟合&logistic回归等总结(Ng第二课)

    昨天学习完了Ng的第二课,总结如下: 过拟合:欠拟合: 参数学习算法:非参数学习算法 局部加权回归 KD tree 最小二乘 中心极限定律 感知器算法 sigmod函数 梯度下降/梯度上升 二元分类 ...

  8. Java中volatile的作用以及用法

    volatile让变量每次在使用的时候,都从主存中取.而不是从各个线程的“工作内存”. volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正 ...

  9. find the most comfortable road(并差集,找差值最小的权值)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  10. 微软正式公布Visual Studio 2013 Update 3 (2013.3) RTM

     昨天微软的Visual Studio 2013 Update 3(Visual Studio 2013.3)正式公布(RTM)了,做为微软认证金牌合作的葡萄城控件,我们组织力量第一时间进行翻译. ...