• Perl函数及参数介绍


    子例程,函数
      子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字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 。。。。
  • 相关阅读:
    个人站立会议内容
    NABCD
    12.2
    12.1
    11.21
    11.20
    11.19
    11.18
    11.17
    11.16个人计划
  • 原文地址:https://www.cnblogs.com/polestar/p/2480118.html
Copyright © 2020-2023  润新知