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编译器才知道详细的规则了。