perl 变量

    技术2022-05-19  51

    创建复杂系统的编程语言的两个特点:

    1. 匿名数据结构,即动态为数据分配内存,而无需变量名.(如C的malloc)

    2. 可指向任何数据结构,无论静态还是动态分配.(如C中的指针)

     

    Perl完全实现了这两个要求,其第二个特点是采用引用(Refrence).

    对已有变量的引用, 在变量名前添加/来创建对它的引用:

    1. 对于标量变量引用

    $a="Hello";

    @array=(10.20);

    %hash=("iPod"=>"apple","core"=>"intel");

    $ra=/$a;

    $rarray=/@array;

    $rhash=/%hash;

     

    2. 对于常量的引用

    $ra=/10;

    $rs=/"Hello";

     

    3.对于数组和hash单个元素的引用

    $r_array_element=/$array[0];

    $r_hash_element=/$hash{"iPod"};

     

    引用本身就是一种标量变量,可被使用如print

    print $ra;

    结果包含两部分,第一部分表明它所引用的值的数据类型,第二部分表明其内存地址

     

    通过引用来间接访问(类似于c中的*P,根据指向的内存地址取值)

    根据$r所引用的数据类型(标量变量,数组,散列hash),分别使用$$r,@$r,%$r来间接访问所引用的变量(整体)。(明显的类型匹配)

    对标量变量:

    $a=2;

    $ra=/$a;

    print $$ra;  # 同print $a;

    对数组:

    $rarray=/@array;

    push (@$rarray,"Hello") #同push(@array,"Hello")

    print $$rarray[1]; #单元素的存取 同print $array[1]

    对散列hash:

    $rhash=/%hash;

    print $$rhash{"key1"}; #单元素的存取 同print $hash{"key1"}

     

    关于优先级的谈论

    $$rarray[i];

    从右到左递减

    [i]>$rarray>$

    也就是${$rarray}[i];

     

    使用引用箭头简易存取数组和散列表元素

    $rarray=/@array;

    print $rarray->[1]; #同print $rarray[1]; 打印数组的第二个元素,只不过此处使用了引用

    同理 散列表有:

    print $rhash->{"Key1"};

     

    引用的使用

    1. 向子例程sub里传递数组和散列表(引用)

    @array1=(1,2,3);

    @array2=(4,5,6);

    AddArrays(/@array1,/@array2);

    print @array1;

    sub AddArrays{

        my ($rarray1,$rarray2)=@_;

        my $length2=@$rarray2;   #标量上下文返回数组元素个数

        for($i=0;$i<$length;$i++){

            $$rarray1[$i]+=$$rarray2[$i]; #或者$rarray->[$i]+=$rarray->[$i];

        }

    }

     

    2. 匿名存储的引用

    a)匿名数组的引用,使用方括号而非圆括号

    $ra=[] #创建一个空的匿名数组,并返回对它的引用

    $ra=[1,2,3]; #创建一个初始化的匿名数组,并返回对它得引用

     

    b)匿名散列表的引用,使用花括号而非方括号

    $ra={} #创建一个空的匿名散列,并返回对它的引用

    $ra={"a",1,"b",2}; #创建一个初始化的匿名散列表,并返回对它得引用

     

    ********在Perl中my操作符定义的变量是局部变量

     

    多重引用即引用的引用在Perl中是可以接受的 如

    $ra=/$a;

    $rra=/$ra;

    $rrra=/$rra;

    print $a;

    print $$ra;

    print $$$rra;

    print $$$$rrra; #得到的都是同样的输出结果

     

    使用引用实现复杂的数据结构

    数组和散列表的元素不能为数组或者散列,因为其只能是标量变量类型,但可以为引用,而引用可以指向数组或者散列,从而实现复杂的数据结构。

    此处使用黑豹书原例:

    %susan={"Name"=>"Susan","Age"=>"40"};

    %john={"Name"=>"John",Age=>"18"};

    %jenifer={"Name"=>"Jenifer",Age=>"16"};

    $susan{"Children"}=[/%john,/%jenifer]; #还记得吗,这里使用方括号建立匿名数组返回引用

    将对John和Jenifer的引用添加到Susan的以“Children”为Key的值里,建立起了母子联系实现了复杂数据结构

     

    要输出Jenifer的Age,可以 print $susan{"Children"}->[1]->{"Age"};   So cool! I think.

    更简洁的是可以省略此处的-> 即 print $susan{"Children"} [1] {"Age"};

     

    如果这个数据关系是不存在的,如下的语句将创建上述结构关系

    $susan{"Children"}->[1]->{"Age"}=18;

    Perl对程序员的效率体现于此

     

    完全的匿名实现

    %susan={"Name"=>"Susan","Age"=>"40"

    "Children"=>[

      {"Name"=>"John",Age=>"18"},

      {"Name"=>"Jenifer",Age=>"16"}

          ]

    };

     

    引用查询

    ref函数,返回false表示非引用,否则返回引用所指向的数据类型

     

    符号引用 

    $x=10;

    $var="x";

    $$var=30;

    print $x结果为30  $$var=$x=30

    ****符号引用对标量变量,数组,散列表都有效

    ****符号引用只对全局变量有效(非my.....)


    最新回复(0)