from: http://www.cnblogs.com/polestar/archive/2012/05/03/2480118.html

子例程,函数
  子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字do,require或use将它加载到脚本里。若要调用一个子例程,用户可以在子例程前加上&符号,或在子例程前加上do关键字,也可以在子例程名后面加上一组括号。如果使用了向前引用(forward reference),在调用子例程时就不需要提供&或括号。

 1 Subroutine declaration:
 2     sub subroutine_name;
 3 Subroutine definition:
 4     sub subroutine_name{ Block }
 5 Subroutine call:
 6     do subroutine_name;
 7     &subroutine_name;
 8     subroutine_name();
 9     subroutine_name;
10 Subroutine call with parameters:
11     &subroutine_name( parameter1,parameter2,.......);
12     subroutine_name( parameter1,parameter2,.......);

示例代码:

 1 #!/user/bin/perl
 2
 3 sub greetme
 4 {
 5     print "Welcome,Valkommen till,Bienvenue!\n";
 6 }
 7
 8 &greetme if defined &greetme; #使用defined函数检查子例程是否已经定义。在使用子例程名时,要求必须提供&标记。
 9
10 print "Program continues ....\n";
11
12 &greetme;
13
14 bye();
15 &bye;
16 #bye;   此种方式调用需使用向前引用,类似C程序中的声明。
17 sub bye;
18 bye;
19
20 sub bye
21 {
22     print "Bye,adjo,adieu.\n";
23 }
24
25 bye();
26 &bye;
27 bye;

运行结果:

1 Welcome,Valkommen till,Bienvenue!
2 Program continues ....
3 Welcome,Valkommen till,Bienvenue!
4 Bye,adjo,adieu.
5 Bye,adjo,adieu.
6 Bye,adjo,adieu.
7 Bye,adjo,adieu.
8 Bye,adjo,adieu.
9 Bye,adjo,adieu.

参数传递
  函数把接收到的参数保存到特殊的perl数组@_中,其中每个元素($_[0],$_[1],.....)称作一个参数。不论参数是标量型还是数组型的,用户把参数传给子例程时,perl默认按引用的方式调用它们。用户可以通过改变@_数组中的值来改变相应实际参数的值。

示例代码:

 1 #!/usr/bin/perl
 2
 3 sub params
 4 {
 5         print 'The values in the @_array are ',"@_\n";#将打印整个数组
 6         print "The first value is $_[0]\n";
 7         print "The last value is ",pop(@_),"\n";#最后一个参数被弹出@_数组,实际参数的个数并未改变
 8
 9         foreach $value (@_)
10         {
11                 $value+=5;
12                 print "The value is $value","\n";
13         }
14 }
15
16 @n=(1,2,3,4,5);
17 params(@n);
18 print "Black in main\n";
19 print "The new values are @n \n";

运行结果:

1 The values in the @_array are 1 2 3 4 5
2 The first value is 1
3 The last value is 5
4 The value is 6
5 The value is 7
6 The value is 8
7 The value is 9
8 Black in main
9 The new values are 6 7 8 9 5 #前四个参数值已经改变,最后一个参数值没有发生变化,因为子例程中执行了pop(@_).

local与my区别
  任何使用local函数声明的变量都是动态拷贝的。该变量不但在创建它的块中可见,而且对于任何从该代码块调用的函数中也是可见的。与local函数声明的变量不同,my函数声明得到的所有变量都只在声明它的子例程中可见,对于该子例程调用的任何其他子例程都是不可见的

  内部->外部:

    1)my和local都只在一个block里有效,出去就失效;

    2)但是local的变量可以继续在这个block中调用的子程序中存在;

    3)如果有与外界同名的变量,两者在block退出后都不影响外界同名变量;

  外部->内部:

    如果在一个block中有一个my修饰的变量和外界的一个变量同名,而且又需要在这个block中使用外界变量时,两个办法:第一个办法,用main的package修饰这个变量名,$main::global。第二个办法,用our修饰,our $global,那么该block中接下来出现的所有$global都是外界的global

示例代码:

 1 #!/usr/bin/perl
 2 $x = 9;
 3 sub mm{
 4     print "$x\n";
 5 }
 6 sub gg_my{
 7     my $x = 11;
 8     print "call-my $x\n";
 9     our $x;
10     print "our-global $x\n";
11     mm;
12 }
13 sub gg_local {
14     local $x = 20;
15     print "call-local $x\n";
16     mm;
17 }
18 gg_my;
19 gg_local;
20 print $x;

运行结果:

1 call-my 11
2 our-global 9
3 9
4 call-local 20
5 20
6 9

创建指针和访问指针地址

 赋值  创建引用 访问地址  使用箭头运算符访问地址 
$sca = 5 $p=\$sca print $$p  
@arr=(4,5,6) $p=\@arr print @$p $p->[0]
    print $$p[0]  
%hash=(key=>'value')    $p=\%hash       print %$p $p->{key}
    print $$p{key}        

指针参数

  当一个子例程接收参数时,便会把参数保存到@_数组中。当把两个数组同时传递给一个子例程时,这两个数组都将保存到@_数组中,并连接成单个列表。如果不知道其中前一个数组长度的话,基本上就不可能再拆开这两个数组了。不过,如果传递给子例程的是两个指针,分别含有这两个数组地址的话,就可以方便地实现数组内容的分离。

示例代码:

 1 #!/usr/bin/perl
 2
 3 my @list1=(1..100);
 4 my @list2=(5,10,15,20);
 5
 6 print "the total is :" ,&addemup(\@list1,\@list2),".\n";
 7
 8 sub addemup
 9 {
10         my( $arr1,$arr2) =( shift,shift);# The two pointers are  shifted from @_
11
12         my $total=0;
13         print $arr1,"\n";
14         print $arr2,"\n";
15
16         foreach $num(@$arr1,@$arr2)
17         {
18             $total+=$num;
19         }
20         $total; #相当于 return $total;
21 }

执行结果:

1 ARRAY(0x182a944)
2 ARRAY(0x183728c)
3 the total is :5100.

文件句柄的引用

示例代码:

 1 #!/usr/bin/perl
 2
 3 open( README,"D:\\perlwork1\\perl.pl") || die;
 4
 5 &readit(\*README);#reference to a typeglob
 6
 7 sub readit
 8 {
 9         my ($passwd)=@_;
10         print "\$passwd is a $passwd.\n";
11         while(<$passwd>)
12         {
13                 print;
14         }
15 }

执行结果:

1 $passwd is a GLOB(0x182a964).
2 #!usr/bin/perl
3 。。。。

Perl函数及参数介绍相关推荐

  1. C++main函数的参数介绍以及如何在main函数前执行一段代码

    C++中参数介绍:https://www.cnblogs.com/jisongxie/p/7892366.html C++中主函数的执行过程以及如何在main函数前执行一段代码:https://www ...

  2. php函数可变参数列表,PHP函数可变参数列表的具体实现方法介绍

    也许对于PHP初级程序员来说,对于PHP函数并不能完全熟练的掌握.我们今天为大家介绍的PHP函数可变参数列表的实现方法主要是利用func_get_args(). func_num_args().fun ...

  3. python机器学习minimize函数参数介绍及作用

    一.问题介绍 在初学机器学习时,在吴恩达机器学习课后作业中经常使用到高级优化算法,计算theta值会更为便捷,在python中,可以使用scipy.optimize包中的minimize函数直接计算得 ...

  4. Socket编程 涵盖代码和函数参数介绍

    Socket是针对端系统,也就是用户主机上开发程序,不涉及网络设备(交换机.路由器) 独立于网卡驱动层之上,不涉及硬件,即基于Packet Driver编程 端:是指通信双方两台电脑 应用编程接口AP ...

  5. Python之函数参数介绍

    Python的参数类型: 普通参数 默认参数 动态参数 普通参数 包括:形参和实参 形参就是形式参数,仅仅是写在函数中,并没有赋值和调用它 实参则是执行函数时用到的参数,它在内存中有赋值 例子: te ...

  6. linux下perl命令行参数,Perl One-Liners | Perl命令行学习1 -e参数

    注:本内容需要点的perl编程基础,最好是读过<perl语言入门>. 本系列是自己平常学习工作中的总结,每一个实例均为我为了讲解而设置的,自己试过的,如有错误,望能见谅 Perl 命令行参 ...

  7. python自定义函数参数_python自定义函数的参数之四种表现形式

    (1)def a(x,y):print x,y 这是最常见的定义方式,调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错 (2)def a(x,y=3 ...

  8. Perl基本数组排序方法介绍

    这篇文章主要介绍了Perl基本数组排序方法介绍,本文讲解基于ASCII码排序.比较函数.按字母顺序排列.Perl对数值排序等内容 本文我们学习如何用Perl对字符串或者数字数组进行排序. Perl有个 ...

  9. ffmpeg 安装和参数介绍

    0.说明: 1).configure,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure –pr ...

最新文章

  1. Django基础知识
  2. Linux多线程之线程同步
  3. 科大讯飞语音合成api
  4. qq应用之超级店长数据分析
  5. jquery.easing.js(转)
  6. 几何学中关于相交圆的这个定理,你还记得吗?
  7. 启动修复可以尝试将您的计算机还原到,如何修复Windows Bootloader问题(如果您的计算机不启动) | MOS86...
  8. vue 声明周期函数_vue-router路由守卫-上
  9. Struts框架介绍(重点)
  10. obj类型的3d人体模型解读
  11. 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续
  12. java输入输出操作c盘文件拒绝访问问题
  13. mySql笔记之基础篇(参看尚硅谷视频)
  14. nar神经网络_NAR 神经网络多步和单步预测
  15. 跳跃表(SkipList)
  16. windows如何查看自己的ip地址
  17. 不同主体的微信小程序相互跳转
  18. OPC通讯开发——客户端开发工具WTopcclient说明手册部分翻译及个人补充
  19. 信息碎片化时代, 如何让学习更有效
  20. 黑客攻防从入门到精通 第7章及后文

热门文章

  1. 数字证书颁发及认证原理
  2. #navigation
  3. 腾讯云服务器的简单使用
  4. 开一家最美证件照照相馆需要注意什么
  5. matlab中的~用法和~=
  6. 达观数据爱心公益再出发,走进广西桥业小学开展捐书助学活动
  7. h5页面调用百度地图获取当前位置并在地图上标注出来
  8. Python实例--遍历文件夹下所有的文件或文件夹
  9. 动物识别系统的规则库
  10. 北京地铁车站换乘示意图行动(2010年4月1日更新完整)