Perl 学习小结
Perl 的意思
?? Pracctical Extraction and Report Language??? 实用摘录与报表语言
?? Pathologically Eclectic Rubbish Lister??? 病态折中式垃圾列表器
?
?? 是先有Perl这个词,后有展开诠释,两种解释都被Larry认可.
?
Perl 的原则
?
一:数据类型
?? 1.常量?
?? 常量用$变量名定义
$name = "ahcming"; # 定义一个字符串常量$age = 24; # 定义一个数字常量
??????? 1)数字.在Perl中,数字都是按双精度浮点数进行运算
255 # 数字默认是十进制0377 # 八进制(octal)数字以0开头,十进制等于2550xFF # 十六进制(hexadecimal)数字以0x开头,十进制等于2550b11111111 # 二进制(binary)数字以0b开头,十进制等于255
???????数字运算符
+ # 2 + 3 = 5- # 2 - 3 = -1* # 2 * 3 = 6/ # 2 / 3 = 0.66666666666% # 取模运算 2 % 3 = 2** # 乘幂运算 2**3 = 8??
??????? 2)字符串.
????????????? 字符串可以被单引号括起来,也可以被双引号括起来,两者的区别如下
'ahcming' # 7 个字符"ahcming" # 同'ahcming'一样'ahcming\n' # 9个字符,\,n 分别算两个字符"ahcming\n" # 8个字符, \n算一个字符(换行符)
????????? ?也就是说双引号中的字符串会对那些特殊字符,变量自动进行替换,而单引号则会原封不动的进行输出.
?
??????????? 字符串操作符
a.字符串连接 ".""hello" . "world" # 等同于"helloworld"b.字符串重复 "x""ahcming" x 3 # 等同于"ahcmingahcmingahcming"c.比较操作符eq # 相等ne # 不等lt # 小于gt # 大于le # 小于等于ge # 大于等于?
?? 2.数组
??? 一些数组常见用法
@names; # 定义一个数组$names[0]; # 引用第0个元素,数组下标从0开始$names[2] = "intoms"; # 向第2个元素赋值,注意,现在@names有3个元素了$names[-1]; # 引用@names中最后一个元素,也就是intoms$names[-100]; # 试图引用倒数第100个元素,严重错误
?
?? 数组初始化及赋值
@num1 = (1,3,50); # 包含3个元素的数组@num2 = (1..100); # 包含从1到100的100个元素的数组@num3 = ($n..$m); # 如果$n<=$m, 则包含$n,$m之间的整数,如果 $n>$m,则数组为空@str = qw(s1,s2,s3,s4); # qw 的好处是s1,不用用引号括起来@path = qw{/usr/bin, /home/aaa, .}; # qw 的定界符可随意?
?? 对数组进行操作的方法
1.pop # 弹出数组尾元素@array = 1..5;$num = pop(@array); # $num = 5;@array现在是1,2,3,42.push # 向数组尾压入元素,可以是多个push(@array, 5); # @array现在是1,2,3,4,5push @array, 6..10; # @array 现在是1,2,3,4,5,6,7,8,9,10@ohers = qw/5 4 3 2 1/;push(@array, @others); # 把others数组压入@array3.shfit # 弹出数组头部元素@array = qw#dino fred barney#;$name = shift(@array);4.unshift # 在数组头部压入一些元素,基本用法同push5.reverse # 转置数组@num = 6..10;@num2 = reverse(@num); # @num2是10,9,8,7,6,@num没有改变6.sort # 按照ASCII顺序对数组进行排序?
?? 3.哈希
?????? 哈希也可以称做关联数组,散列等等
??? a.定义
%hash=(); # 声明一个空的hash%hash={}; # 声明一个数组类型的空hash%hash=("lincon",25,"ahcming",13);%hash=("lincon"=>25, "ahcming"=>13); # 以上两种写法相同,不过下面的更清楚点
?? b.访问hash
%hash{key} # 返回hash中key对应的value,如果hash中不存在key,则返回undef当%hash没有初始化时可以用exists(%hash{key})来判断是否存在key// 有好的例子时补上 $value = exists(%hash{key})?$hash{key}:defaultValue;$hash{key} = value; # 向hash中放入key==>value的键值对
??? c.遍历hash
for $key ( keys(%hash) ) { print $key . ", " . $hash{$key} . "\n";}while( ($key,$value) = each(%hash) ) { print "$key ==> $value\n";}
?? d.其它操作
i) 获得hash的长度$hash_size = keys(%hash); # %hash的长度放到$hash_size中print scalar keys(%h) . "\n"; # 打印%h的长度。这里用了scalar来返回数组长度ii)清空hashundef(%hash);
?? e.哈希的哈希
// 有好例子时补上?
二:代码流程控制
?? 1.顺序
?? 2.选择
1.单ifif( boolean表达式 ) { # 一些操作}2.if-elseif( boolean表达式 ) { # 一些操作} else { # 当条件为假的操作}3.if-elsif-elseif( boolean表达式 ) { # 一些操作} elsif( boolean表达式 ) { # 一些操作} else { # 其它情况的操作}?
?? 3.循环
1.for 循环for( $x = 0; $x < 10; $x++ ) { #}联想C语言,你就知道其它形式的 for循环应该怎么写了,比如无限循环for(;;) { # }2.foreachforeach (@array) { # 依次从读取数组中每个元素放在$_中}foreach $e (@array) { # 依次读取@array中每个元素放到$e中}3.whilewhile( boolean 表达式 ) { # 一些操作}
?
? 退出循环:
next; # 退出本次循环,相当C中的continuelast; # 退出所有循环,相当C中的break
?
三:定义子过程
常用格式
sub funName { #return xxx;}
?
说明:
???? 1.funName 是进程名称.通过&funName()进行调用方法
&fun(); # 无参调用 &fun("ahcming", 18); # 推荐这两种形式调用方法fun("ahcming", 18); # 只要不与perl系统函数名冲突,就可以去掉&fun "ahcming", 18 # 只要加上括号看起来想函数,他就是函数,如果不影响语义就可以去掉括号?
???? 2.funName 可省略,那就相当于匿名方法,用法如下
$value = sub { # 一些操作 # 返回一个值,数组,对象什么的}
?
? 3.参数的传递.
?????? 所有的参数,不论数目,类型,都放在一个数组($_)里面
?????? 参数传递是引用传递(因为放在数组里面),所以在方法里面对参数进行修改会影响到外面的变量
?????? 可以有方法里面用my 到接收到的参数再进行声明,形成局部变量
sub fun { my($value, @array, %map) = $_; # 对参数进行处理 # 逻辑运算 # 其它乱七八遭的}?
??? 4.返回值
????? 方法可以用return 显式的指定返回值,也可以隐式的指定,隐匿指定的规则是方法的最后一行的结果就是方法的返回值
sub fun { # xxxxxxx # xxxxxxxxx # waitarray 可用来判定调用方法的语意环境是列表还是标量 return waitarray?@array:$value;}?
?
?