博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
perl学习笔记(4)
阅读量:5900 次
发布时间:2019-06-19

本文共 3081 字,大约阅读时间需要 10 分钟。

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

  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
 

这次就到这。

 本文转自 hexiaini235 51CTO博客,原文链接:http://blog.51cto.com/idata/803391,如需转载请自行联系原作者

你可能感兴趣的文章
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
PHP如何学习?
查看>>
谈教育与成长
查看>>
jni c++
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
discuz X3登录流程分析
查看>>
上传图片预览
查看>>
程序设计的一些原理
查看>>
lagp,lacp详解
查看>>
LVS之DR模式原理与实践
查看>>
struts2+extjs
查看>>