Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29030463
  • 博文数量: 101
  • 博客积分: 4011
  • 博客等级: 上校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-18 10:37
个人简介

落魄青年,挨踢民工,已经转行

文章分类

全部博文(101)

文章存档

2008年(47)

2007年(54)

分类:

2007-12-13 17:10:55

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}代替,但->号不能用于普通数组或者哈希,只能用于引用,另外记住引用始终是标量,列表量中的元素也始终是标量(普通标量或者引用,引用也是标量)
 
因此上面的]}[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 如果->位于数组的下标([])或者哈希的索引({})之间,则->可以进一步省掉,如上条的->可以省掉,最后变为
 
    #还是 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  ];
print  ${$ref_array[1]}[1];
print  "$ref_array[1]->[1]";
print  $ref_array[1][1];

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

阅读(2631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~