在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
子例程,函数 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. 参数传递 示例代码: 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区别 内部->外部: 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 创建指针和访问指针地址
指针参数 当一个子例程接收参数时,便会把参数保存到@_数组中。当把两个数组同时传递给一个子例程时,这两个数组都将保存到@_数组中,并连接成单个列表。如果不知道其中前一个数组长度的话,基本上就不可能再拆开这两个数组了。不过,如果传递给子例程的是两个指针,分别含有这两个数组地址的话,就可以方便地实现数组内容的分离。 示例代码: 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 。。。。
|
请发表评论