Perl函数及参数介绍

摘要:
子程序,函数子程序,函数的范围是指在程序中可以看到的范围。子例程是全局的,可以放在脚本的任何地方,甚至放在其他脚本文件中。使用其他文件中的子程序时,应使用关键字do、require或use将它们加载到脚本中。要调用子例程,可以添加&符号,或在子例程之前添加do关键字,或在子程序名称之后添加一组括号。如果使用正向参考

子例程,函数
  子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字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 。。。。

免责声明:文章转载自《Perl函数及参数介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇更改file文件上传默认CSS样式Centos6.5安装Oracle11.2.0.4 RAC(完整版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【JavaScript数据结构系列】02-栈Stack

【JavaScript数据结构系列】02-栈Stack码路工人 CoderMonkey转载请注明作者与出处 ## 1. 认识栈结构 栈是非常常用的一种数据结构,与数组同属线性数据结构,不同于数组的是它是一种受限的线性结构。 画一张图来说明: 如上图所示, 最新入栈的元素/最底下的元素,为栈底 最后一个/最上面的元素,为栈顶 最后一个入栈元素最先出栈(L...

【Grafana】Grafana模板自定义-1-创建选择框

如何创建选择框 第一步:编辑模板 第二步:配置变量 配置说明: General: 【Name】变量名,后面模板中如果要按条件筛选,会用到这个变量名。 【Type】类型,目前没仔细研究,使用默认的Query 【Label】标签,筛选框的标签名,提示作用。可以随便填写,可读性高就行。 【Hide】隐藏配置。默认是不隐藏,不隐藏就会在模板左上角显示对应变...

Windows系统下JDK 1.6环境变量配置

在新的打开界面中的系统变量里需要设置三个属性JAVA_HOME、 PATH、 CLASSPATH 其中在没安装过jdk的环境下,PATH属性是本来存在的而JAVA_HOME和CLASSPATH是不存在的。 点新建,然后在变量名写上   JAVA_HOME ,顾名其意该变量的含义就是java的安装路径,呵呵,然后在变量值写入刚才安装的路径 D:\Java\j...

KMO检验和Bartlett球形检验

KMO检验和Bartlett球形检验因子分析前,首先进行KMO检验和巴特利球体检验,KMO检验系数>0.5,(巴特利特球体检验的x2统计值的显著性概率)P值<0.05时,问卷才有结构效度,才能进行因子分析,因子分析主要是你自己做了一份调查问卷,你要考量这份问卷调查来的数据信度和效度如何,能不能对你想要调查的东西起代表性作用啊,说得很通俗呵呵不知...

Perl的open函数

引自 http://blog.csdn.net/stonesharp/article/details/6744634 一.文件操作1.打开文件用open函数可将文件句柄与某文件联系起来,提供访问文件的接口,即打开文件.语法为:open(FILEVAR, "filepath");filepath可以有如下三种模式:"filepath" 以只读模式打开文件."...

var和let区别简述

   因为习惯用var声明变量,以至于ES6出了let来替代var,我依然继续用var,直到后来慢慢了解let之后,开始尝试使用     不同点:       ①:var属于ES5规范,let属于ES6规范      ②:var有预处理机制,let没有。预处理机制也就是常说的声明提前       声明提前:不管变量被声明在函数什么位置,所有变量声明都会被提...