Perl 的意思
Pracctical Extraction and Report Language 实用摘录与报表语言
Pathologically Eclectic Rubbish Lister 病态折中式垃圾列表器
是先有Perl这个词,后有展开诠释,两种解释都被Larry认可.
Perl 的原则
一:数据类型
1.常量
常量用$变量名定义
$name = "ahcming"; # 定义一个字符串常量 $age = 24; # 定义一个数字常量
1)数字.在Perl中,数字都是按双精度浮点数进行运算
255 # 数字默认是十进制 0377 # 八进制(octal)数字以0开头,十进制等于255 0xFF # 十六进制(hexadecimal)数字以0x开头,十进制等于255 0b11111111 # 二进制(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,4 2.push # 向数组尾压入元素,可以是多个 push(@array, 5); # @array现在是1,2,3,4,5 push @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数组压入@array 3.shfit # 弹出数组头部元素 @array = qw#dino fred barney#; $name = shift(@array); 4.unshift # 在数组头部压入一些元素,基本用法同push 5.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)清空hash undef(%hash);
e.哈希的哈希
// 有好例子时补上
二:代码流程控制
1.顺序
2.选择
1.单if if( boolean表达式 ) { # 一些操作 } 2.if-else if( boolean表达式 ) { # 一些操作 } else { # 当条件为假的操作 } 3.if-elsif-else if( boolean表达式 ) { # 一些操作 } elsif( boolean表达式 ) { # 一些操作 } else { # 其它情况的操作 }
3.循环
1.for 循环 for( $x = 0; $x < 10; $x++ ) { # } 联想C语言,你就知道其它形式的 for循环应该怎么写了,比如无限循环 for(;;) { # } 2.foreach foreach (@array) { # 依次从读取数组中每个元素放在$_中 } foreach $e (@array) { # 依次读取@array中每个元素放到$e中 } 3.while while( boolean 表达式 ) { # 一些操作 }
退出循环:
next; # 退出本次循环,相当C中的continue last; # 退出所有循环,相当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; }