这次学习一维数组(列表)。

  1. 给数组变量赋值以@开头。
  2. 一维数组索引从0开始。
  3. 用$#来取得数组最后一个元素编号(元素个数要加1),例如#$family。
  4. 赋值运算符左边的表达式类型决定右边的表达式计算时所在的上下文。例如,;可取得数组family元素的个数。例如,if(@family){...}中的上下文是布尔值,将判断@family中元素个数,为0时false,有元素时为true,即,判断数组是否包含元素。scalar()函数可强制指定上下文为标量。
  5. 数组变量和标量变量可以共用一个名字。$family和@family是不同的变量。
  6. qw中用逗号会出这样的错误提示:Possible attempt to separate words with commas
  7. print @family;和print "@family";的差别是后者用空格分开。

做个练习(保存为f41.pl):

 
  1. #!/usr/bin/perl -w  
  2. @boys=qw(Grey Peter Bobby);  
  3. @girls=qw(Marcia Jan Cindy);  
  4. @kids=(@girls,@boys);  
  5. @family=(@kids,('Mike','Carol'),'Alice');  
  6. $family=qq(test);  
  7. print q(@boys=); print qq(@boys); print qq(\n);  
  8. print q(@girls=); print qq(@girls); print qq(\n);  
  9. print q(@kids=); print qq(@kids); print qq(\n);  
  10. print q(@family=); print qq(@family); print qq(\n);  
  11. print q($family[0]=); print $family[0]; print qq(\n);  
  12. print q(@family[0,2]=); print qq(@family[0,2]); print qq(\n);  
  13. print q($family=); print qq($family); print qq(\n);  
  14. $size=@family;  
  15. print q($size=); print qq($size); print qq(\n);  
  16. print q(scalar(@family)=); print scalar(@family); print qq(\n);  

$ perl f41.pl

@boys=Grey Peter Bobby
@girls=Marcia Jan Cindy
@kids=Marcia Jan Cindy Grey Peter Bobby
@family=Marcia Jan Cindy Grey Peter Bobby Mike Carol Alice
$family[0]=Marcia
@family[0,2]=Marcia Cindy
$family=test
$size=9
scalar(@family)=9
 

再做个练习(保存为f42.pl):

 
  1. #!/usr/bin/perl -w
    print qq(Input array elements:\n);
    @myarray=<STDIN>;
    chomp @myarray;
    print qq(Your inputs:\n);
    $i = 0;
    foreach $myelm (@myarray){
            print q(@myarray[);print qq($i); print qq(]=);
            print qq($myelm);
            print qq(\n);
            $i++;
    }

Linux屏幕中录入数组元素用ctrl+d结束,用回车间隔。

$ perl f42.pl

Input array elements:
aa
bb
cc
Your inputs:
@myarray[0]=aa
@myarray[1]=bb
@myarray[2]=cc
 

数组可以用来赋值:

($a,$b,$c)=qw(apple,orange,banana);#a,b,c被分别赋值
($a,@b,$c)=qw(apple,orange,banana);#a=apple,@b=(orange,banana),$c=undef
($a,$b,$c)=qw(apple,orange,banana,peach);#a,b,c被分别赋值,peach没有用到
($a,$b,$c)=qw(apple,orange);#a,b被分别赋值,$c=undef

打印数组:print "@family";

重要函数:split、join、reverse和sort。

 

通过本次学习,我加深了对perl的印象。目前感觉可以用“元素”和“列表”来总结perl中的一些概念。元素有数值和字符串两种,列表中的元素可能是数值也可能是字符串。指向元素的变量用$开头,指向列表的变量用@开头。继续思考下去,有个问题是perl是如何在数值和字符串之间转换的?要深入理解perl,理解这个转换细节是必要的。可以参考: 。顺便的,往后翻几页可以看到这里提到了“弄清列表和数组间的差别”,我想应该修改为“弄清变量名称和变量内容的差别”,变量名称和变量内容在内存中应是分开存储的,@mylist=('a','b','c'); 中“mylist”是变量名,('a','b','c')是变量内容的表达式,变量内容也可以表达为qw(a b c)。那么,理解$size=()=qw(a b c);语句,就应该是这样:()=qw(a b c)上下文环境要求返回列表不要求变量名引用,$size=....上下文要求返回标量,根据perl的自动转换“规矩”,就返回了3。至于为什么$size=qw(a b c);返回c而不是3,也较容易理解:qw(a b c)只是个表达式,这个表达式放到列表上下文中会被解析为列表存储在内存中,但是到了标量上下文中就是$size=('a','b','c'); 根据perl的自动转换“规矩”,返回了c。

练习(f43.pl):

 
  1. #!/usr/bin/perl -w  
  2. $size=qw(a b c);  
  3. print qq($size \n);  
  4. $size=()=qw(a b c);  
  5. print qq($size \n); 

$ perl f43.pl

Useless use of a constant in void context at f43.pl line 2.
Useless use of a constant in void context at f43.pl line 2.
c
3

上面输出中报了"Useless use of a constant in void context"报警信息的意思是$size=qw(a b c); 这个语句前两个值a和b没派上用场。

修改成下面这样就不会报警了:

 
  1. #!/usr/bin/perl -w  
  2. $size=qw(c);  
  3. print qq($size \n);  
  4. $size=()=qw(a b c);  
  5. print qq($size \n); 

$ perl f43.pl

c
3
 

这次就到这。