文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>列表量杂记

列表量杂记

时间:2007-12-13  来源:tonywam1036

1 列表量不管是数组还是哈希 赋值时都是用(),这本来就是列表的表达方式,不能用[],{},如 my %fruit = (1=>apple,2=>banana,3=>peach,4=>orange); @secondArray = ("A".."E"); 也可以用qw引起符号,qw(xx yy zz),括号内用空格隔开,不要用逗号 ","   2 数组和哈希元素的访问符号不一样,数组用[],哈希用{}.列表量的元素的表达式前面是用$,不是用@,%,如      print $fruit{1};  #打印出"apple",key 1不用加引号    print $[2];       #打印出字母 "C"   3 数组引用赋值简洁写法用[],哈希引用赋值简洁写法用{},和第2条是一致的   $hatest = {1=>"Haha",3=>"Yes"}; # hatest是哈希引用,是标量喔
print %$hatest;
  $artest = [1,2,3,4];            # artest是数组引用,是标量喔
print @$artest; 
  4 列表量引用的整体解引用都是用{}配合变量前面的类型指示符(@%)来进行   如 @Array1=(1,2,3,4);      $ref_Array1=\@Array1; 对$ref_Array解引用表示:     @{$ref_Array1} #数组解引用用@{}   又如 $hatest = {1=>"Haha",3=>"Yes"};     %haha = %{$hatest}; #哈希解引用用%{}     while (($key, $value) = each %haha){
       print “$key => $value\n”;
       };
标量引用也是符合这个法则的,如        $name = "peter";        $ref_name = \$name;        print "My name is",${$ref_name}; #标量解引用用${}   5 列表量解引用后再取元素,常用的表达式是${DUMMY}[$y],最前面的"$"表示元素是个标量(当然列表量的元素只能是标量(引用或者普通标量)),如上面的   如 @Array1=(1,2,3,4);      $ref_Array1=\@Array1; 取第2个元素,表达式为     ${$ref_Array1}[1] #取数组元素不是整个数组,前面符号@改为$,不同于第4条   6 如果解引用再取的元素是普通标量,不再是数组的或哈希的引用,则解引用用的符号{}可以省掉。第4条的例子可以改成:    print @$ref_Array1;  第5条的例子改写成:    $$ref_Array1[1];   但如果是这样,不可以省掉{} $\="\n"; @firstarray = (66,88,55);
@secondarray = (7,999,3,5,8,23,90);
@ref_array = (\@firstarray,\@secondarray); 
print  "${$ref_array[1]}[1]";
  结果是999,由于$ref_array解引用后是一个数组,此处{}不能省掉,否则perl不知道如何解释。这里解释一下表达式的求值过程:里面先开始,先求ref_array[1]的值,就是直接数组查下标求值,结果是一个引用标量,前面冠$(见第2条),再用${}解引用再次查下标求值,结果是999.     7 对于列表量的引用,如果要解引用并且访问列表量中某个元素,可以使用指针指向操作符简化表达式,也就是形如${DUMMY}[$y],用 DUMMY->[$y]或者DUMMY->{$y}代替,但->号不能用于普通数组或者哈希,只能用于引用,另外记住引用始终是标量,列表量中的元素也始终是标量(普通标量或者引用,引用也是标量)   因此上面的${$ref_array[1]}[1]可以改写为           $ref_array[1]->[1] #    DUMMY= $ref_array[1]   * ->的含义:use the value of the left side of -> as an address and dereference it as a pointer to an array(hash).   8 如果->位于数组的下标([])或者哈希的索引({})之间,则->可以进一步省掉,如上条的->可以省掉,最后变为       $ref_array[1][1] #还是 999
 
不符合这条规矩的不能省,如       $ref_Myarray = [7,9,[3,5,8],[23,90]];
    print $ref_Myarray->[2][1]; #打印出 5
    print "\n";
红色的->不能省。
  ** 总结一下7,8条,“->”有时候可以省,但绝对不要另外加      9 {}解引用符号不主动结合别的符号,它优先级最高。[],{}取引用对象元素操作是左结合的,优先级中等,->指针运算也是左结合的,优先级中等。$,@,%变量类型指示符是右结合的,优先级比较低,但是右结合的范围不能跨越->符号,可以跨越[]{}。(注:自己总结的语言,不知标准的表达方式)     10 上面我们用了多维数组,其实Perl并不是直接支持多维数组,是通过把一个数组的引用作为另一个数组的元素来变通实现的,同样C语言并不直接支持多维数组,但是可以通过数组的数组来变通实现,直接支持多维数组的语言有pascal,可以用形如array[m,n]这样的语句访问某个元素,其他暂时不知道。    如 array1是个整数二维数组,访问它的第1行的第2列的表达式如下:     ${$array1[0]}[1];       $array1[0]->[1];   # 紫色部分还是上面的紫色部分     $array1[0][1]; 如前几条所言,这三种写法是等价的。 显然 $array1[0]是个引用,该引用指向一个被嵌套的数组。

11 perl跟c,pascal都不太一样,太会解释了。比如第6条,有以下5种写法都能通过

$\="\n";
@firstarray = (66,88,55);
@secondarray = (7,999,3,5,8,23,90);
@ref_array = (\@firstarray,\@secondarray);
print  @{$ref_array[1]}[1];
print  ${@ref_array[1]}[1];
print  ${$ref_array[1]}[1];
print  "$ref_array[1]->[1]";
print  $ref_array[1][1];

最后还是觉得perl的规则有些复杂,没有C清晰,很容易迷糊。大概知道perl编译器才知道详细的规则了。

相关阅读 更多 +
排行榜 更多 +
坦克战争世界

坦克战争世界

模拟经营 下载
丛林反击战

丛林反击战

飞行射击 下载
几何飞行安卓版

几何飞行安卓版

飞行射击 下载