Perl函数及参数介绍
2012-05-03 09:57
204 查看
子例程,函数
子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字do,require或use将它加载到脚本里。若要调用一个子例程,用户可以在子例程前加上&符号,或在子例程前加上do关键字,也可以在子例程名后面加上一组括号。如果使用了向前引用(forward reference),在调用子例程时就不需要提供&或括号。
示例代码:
运行结果:
参数传递
函数把接收到的参数保存到特殊的perl数组@_中,其中每个元素($_[0],$_[1],.....)称作一个参数。不论参数是标量型还是数组型的,用户把参数传给子例程时,perl默认按引用的方式调用它们。用户可以通过改变@_数组中的值来改变相应实际参数的值。
示例代码:
运行结果:
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
示例代码:
运行结果:
创建指针和访问指针地址
指针参数
当一个子例程接收参数时,便会把参数保存到@_数组中。当把两个数组同时传递给一个子例程时,这两个数组都将保存到@_数组中,并连接成单个列表。如果不知道其中前一个数组长度的话,基本上就不可能再拆开这两个数组了。不过,如果传递给子例程的是两个指针,分别含有这两个数组地址的话,就可以方便地实现数组内容的分离。
示例代码:
执行结果:
文件句柄的引用
示例代码:
执行结果:
子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字do,require或use将它加载到脚本里。若要调用一个子例程,用户可以在子例程前加上&符号,或在子例程前加上do关键字,也可以在子例程名后面加上一组括号。如果使用了向前引用(forward reference),在调用子例程时就不需要提供&或括号。
Subroutine declaration: sub subroutine_name; Subroutine definition: sub subroutine_name{ Block } Subroutine call: do subroutine_name; &subroutine_name; subroutine_name(); subroutine_name; Subroutine call with parameters: &subroutine_name( parameter1,parameter2,.......); subroutine_name( parameter1,parameter2,.......);
示例代码:
#!/user/bin/perl sub greetme { print "Welcome,Valkommen till,Bienvenue!\n"; } &greetme if defined &greetme; #使用defined函数检查子例程是否已经定义。在使用子例程名时,要求必须提供&标记。 print "Program continues ....\n"; &greetme; bye(); &bye; #bye; 此种方式调用需使用向前引用,类似C程序中的声明。 sub bye; bye; sub bye { print "Bye,adjo,adieu.\n"; } bye(); &bye; bye;
运行结果:
Welcome,Valkommen till,Bienvenue! Program continues .... Welcome,Valkommen till,Bienvenue! Bye,adjo,adieu. Bye,adjo,adieu. Bye,adjo,adieu. Bye,adjo,adieu. Bye,adjo,adieu. Bye,adjo,adieu.
参数传递
函数把接收到的参数保存到特殊的perl数组@_中,其中每个元素($_[0],$_[1],.....)称作一个参数。不论参数是标量型还是数组型的,用户把参数传给子例程时,perl默认按引用的方式调用它们。用户可以通过改变@_数组中的值来改变相应实际参数的值。
示例代码:
#!/usr/bin/perl sub params { print 'The values in the @_array are ',"@_\n";#将打印整个数组 print "The first value is $_[0]\n"; print "The last value is ",pop(@_),"\n";#最后一个参数被弹出@_数组,实际参数的个数并未改变 foreach $value (@_) { $value+=5; print "The value is $value","\n"; } } @n=(1,2,3,4,5); params(@n); print "Black in main\n"; print "The new values are @n \n";
运行结果:
The values in the @_array are 1 2 3 4 5 The first value is 1 The last value is 5 The value is 6 The value is 7 The value is 8 The value is 9 Black in main 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
示例代码:
#!/usr/bin/perl $x = 9; sub mm{ print "$x\n"; } sub gg_my{ my $x = 11; print "call-my $x\n"; our $x; print "our-global $x\n"; mm; } sub gg_local { local $x = 20; print "call-local $x\n"; mm; } gg_my; gg_local; print $x;
运行结果:
call-my 11 our-global 9 9 call-local 20 20 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} |
当一个子例程接收参数时,便会把参数保存到@_数组中。当把两个数组同时传递给一个子例程时,这两个数组都将保存到@_数组中,并连接成单个列表。如果不知道其中前一个数组长度的话,基本上就不可能再拆开这两个数组了。不过,如果传递给子例程的是两个指针,分别含有这两个数组地址的话,就可以方便地实现数组内容的分离。
示例代码:
#!/usr/bin/perl my @list1=(1..100); my @list2=(5,10,15,20); print "the total is :" ,&addemup(\@list1,\@list2),".\n"; sub addemup { my( $arr1,$arr2) =( shift,shift);# The two pointers are shifted from @_ my $total=0; print $arr1,"\n"; print $arr2,"\n"; foreach $num(@$arr1,@$arr2) { $total+=$num; } $total; #相当于 return $total; }
执行结果:
ARRAY(0x182a944) ARRAY(0x183728c) the total is :5100.
文件句柄的引用
示例代码:
#!/usr/bin/perl open( README,"D:\\perlwork1\\perl.pl") || die; &readit(\*README);#reference to a typeglob sub readit { my ($passwd)=@_; print "\$passwd is a $passwd.\n"; while(<$passwd>) { print; } }
执行结果:
$passwd is a GLOB(0x182a964). #!usr/bin/perl 。。。。
相关文章推荐
- Perl函数及参数介绍
- ParseInt函数参数设置介绍
- C语言可变参数函数的使用及相关函数介绍
- WinMain函数参数介绍
- Python中函数的参数传递与可变长参数介绍
- sws_getContext函数参数介绍
- WinMain函数参数介绍
- ParseInt函数参数设置介绍
- 详细介绍Python函数中的默认参数
- perl 函数参数中传递数组和引用的一些问题
- perl 函数参数中传递数组和引用的一些问题
- C#调用VC DLL接口函数参数类型转换方法介绍
- Perl函数参数中传递数组和引用的使用
- perl 函数参数传递与返回值(一)
- 函数介绍形参,实参,位置参数,关键参数
- perl函数的参数接收方法
- 实用的WordPress函数使用说明、参数介绍(二)
- [Perl] Getopt 函数来接收用户参数的使用
- PostMessage函数参数介绍
- WinMain函数参数介绍