设为首页 收藏本站
查看: 1103|回复: 0

[经验分享] Perl函数及参数介绍

[复制链接]

尚未签到

发表于 2015-12-25 16:18:29 | 显示全部楼层 |阅读模式
  子例程,函数
  子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字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=\$scaprint $$p
@arr=(4,5,6)$p=\@arrprint @$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 。。。。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156332-1-1.html 上篇帖子: perl 第1章 概述 下篇帖子: Learning Perl ... (转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表