perl: 数据类型 和 运算符
Perl数据类型和运算符: ? ----------------------- 布尔类型bool: 数字:0为假,其它为真。 字符串:空字符串为假(包括‘0’),其它非空为真。 ? -------------------------- Perl的标量scaler: 1.数字:整数、浮点数 2.字符串:单引号、双引号 ? 浮点数直接量: 可以用小数点表示也可以用指数表示. ? 整数直接量: 在perl里整数其实都是转换成浮点数运算的. 有十进制、二进制(0b开头)、八进制(0开头)、十六进制(0x开头)。 ? 数字的操作符: + - * /? %? 取模(求余) ** 乘幂 ? 数值相关函数: abs???? VALUE:??返回绝对值 rand?? :?? ??返回[0,1)之间的随机分数. rand??? EXPR: 返回[0,expr)之间的随机分数. srand? ?EXPR: 为rand设置随机数种子.在相同的随机数种子下rand结果相同. sqrt??? EXPR: 返回正数的平方根. int hex oct exp log atan2 sin cos ? 单引号字符串中的值除了反斜线和单引号都是原样输出。 ‘’??? :输出下划线 ‘’’??? :输出单引号 ‘n’??? :输出n,而不是换行。 ? 双引号字符串中的标量变量内插: “$var”??? :? 标量变量内插 “@arr”:数组内插 “@arr[index]” :数组元素内插。 “%hash{“key”}”: 哈希元素内插 “n”:换行 ? 字符串的操作符: .?? 连接操作 x?? 重复操作 ? 标量相关函数: chomp??? VARIABLE 去掉结尾的n。 chop??? VARIABLE ? reverse??? LIST 翻转数字或字符串。 ? index??? STR,SUBSTR[,POSITION] 在str中从position往后开始找substr,返回从0开始的首次出现的位置.否则返回-1. ? rindex??? STR,POSITION] 在str中找position之前的substr,返回从0开始的最后一次出现的位置,否则返回-1。 ? substr??? EXPR,OFFSET[,LENGTH[,REPLACEMENT]] 返回从0开始的expr字符串中从offset开始往后的length长度的子串。 如果给出replacement就用它替换选中的子串。 省略length就是到expr结尾。 offset为-1表示expr的最后一个字符, substr($string,offset,length) = “newstring”;??? #改变原来字符串中选中部分的值。 ? sprintf??? FORMAT, LIST 返回格式化后的结果,可以保存到一个字符串中使用。 参数和printf一样。 ? length??? EXPR:?返回字符串长度. chr??? EXPR:将数字变成字符. ord??? EXPR:将字符变成数字. hex oct lc lcfirst uc ucfirst crypt pack ? "tr///","q//","qq//","y///" ? ---------------------------- 标量变量: Perl的变量也叫标量变量,就是存储标量的变量.使用$开头。 Perl的变量对大小写敏感,变量以字母下划线数字组成,但是不能用数字开头. 小写字母表示普通变量,大写字母用来表示特殊变量. 使用首字母大写或下划线来赋予变量具体含义. 变量最好用{}括起来。 默认情况下perl中的所有变量都是全局变量。 ? “$var”?? : 双引号字符串中的标量变量会被当前的值替换掉。 ? perl的标量的操作符都支持复合赋值: +/-/*//= %= **= .= x= ? 综合函数: ? undef函数: 还没有赋值就使用的标量变量就是undef的,数字默认为0,字符串默认为空字符串。 $var = undef;???? #创建一个undef值。 ? defined函数: 如果$val是undef值函数返回假,否则返回真。 ? formline lock prototype reset scalar ? ------------------------------------ perl的列表list: 列表就是标量的有序集合,列表是标量。 列表中的元素可以是标量、列表和表达式。 列表中使用的数组其实是转换成了列表。 列表中使用的变量其实是转换成了标量。 列表除了用小括号()来做定界符还可以使用任何标点符号。 qw!/#/$/%str1?? str2 …!/#/$/% qw[/{/<str1?? str2??…]/}/> ? (var1,var2 …) :就是小括号中用逗号隔开的一系列值。 (var1..val2):使用范围操作符..每次加1,var1要小于var2。 ():空列表 (var1..var2):var1大于var2就是空列表。 (list)[n] :? 列表的切片 (list)[m,n,x,…] : 同时获取多个元素,切片的下标可以使任意的。 ? 列表的值可以赋给变量: ($var1,$var2 …) = (val1,val2 …); 如果列表的值多了就忽略,如果变量的值多了就使undef值。 ? 互换两个变量的值: ($a,$b) = ($b,$a);?? ($arr[m],$arr[n]) =($arr[n],$arr[m]); ? qw//:???? 单词列表 qw(str1?? str2??…):qw列表,perl将其解释为多个单引号内的字符串,不能再其中使用n或标量变量,其中的空白字符会被抛弃。 ? reverse: @arr= reverse(list);??? #将list中的元素反转然后返回给arr,list不变。 @arr= reverse list;??? #同上 ? sort: @sorted= sort(list);??? #根据ACSII对list排序,将结果返回给sorted,list不变。 @sorted= sort??? list; ? join??? EXPR,LIST:?用expr分隔list的元素. ? grep??? BLOCK??? LIST ??????????? EXPR,??? ?LIST 从list中根据block或expr的规则选出符合条件的值。 ? map? BLOCK??? LIST ???? ?EXPR,??? LIST ? unpack??? TEMPLATE[,EXPR] ? ------------------------------ perl的数组array: 数组是存储列表的变量,数组是变量。 数组长度没有上限的,没有定义的数组元素就是undef值。 数组元素通过下标来访问和赋值的。 最后一个数组元素的索引也可以是-1。 ? $arr[index] = val; print?? ”$arr[index]”; $#arr:数组最后一个元素的索引值(下标),数组为-1。 $arr[$#arr] == $arr[-1] @arr : 用@来引用整个数组 @arr1 = @arr2;??? #其实是列表的复制,只是用数组的形式而已。 @arr = ();??? #清空数组 print??? “@arrn”;???#可以直接打印整个数组 print??? @arr;???#打印整个数组,没有空格 @arrays[n] :?? 数组切片 @arrays[m,…] :数组切片 “@arr” : 双引号中的数组会被数组的当前前值替换掉。 “@arr[index]” : 双引号中的数组元素会被元素当前值替换掉。 双引号中的@name如果不是表示数组需要写成@name。 ? 数组相关函数: ? pop: $var= pop(@arr);??? #把数组arr中的最后一个元素取走并返回。 pop??? @arr;???????? #同上 如果数组是空的仅仅返回undef。 ? push: push(@arr,val);??? #添加val到数组的尾端 push? @arr,list;??? #同上 ? shift: $var = shift(@arr);??? #把数组arr中的第一个元素取走,并返回。 shift??@arr;??? #同上 如果数组是空的返回undef。 ? unshift: unshift(@arr,val);??? #在数组开头放入val。 unshift???@arr,list??? #同上。 ? keys????? values each splice ? ---------------------------------- perl的哈希类型hash: 哈希由无序的键值对组成,键必须是唯一的字符串(或结果为字符串的表达式),值可以是任意类型的任意值。如果对已存在的哈希元素赋值就会覆盖之前的值。 通过键来检索哈希或者给哈希赋值: $hash{$key} $hash{“keystring”} = “value”; %hash 用来表示整个哈希。 @arr = %hash;??? #哈希松绑,将哈希变成键值对的列表。 %hash = @arr/list;??? #数组或列表会变成键值对。 %newhash = %hash;??? #复制哈希 %inverse_hash = reverse ??%hash;???#将键值对位置互换,键变成了值(值唯一才有用)。 print??? %hash;???#打印的是没有空格的键值对,哈希不能内插。 ($hash{“key1”},…)? :? 哈希切片 @hash{ qw / key1 …/ }?? : 哈希切片 ? 常用的hash写法(使用胖箭头): my %hashname = ( ??? “str1” => “val1”, ??? “str2” => “val2”, ); ? %ENV哈希用来存放环境变量。 Print “PATH =$ENV{PATH}n”;??? #打印path环境变量 Print “CHARACTER =$ENV{CHARACTER}n”;??? #打印在程序外设置的环境变量 ? 哈希相关函数: ? keys HASH: my@arr = keys %hash;??? #获取哈希的键列表。 my$count = keys %hash;??? #获取键值对个数。 ? values HASH: my@arr = values %hash;??? #获取哈希的值列表。 ? each HASH: ($key,$value) = each??? %hash;??? #遍历哈希键值对。 while(($key,$value) = each %hash) { ??? print “$key => $valuen”; } ? exists? expr: exists$hash{“key”};????? #检查中是否有某个键。值是undef的键也是存在的。 if(exists $hash{“key}) { ??? print “The key exist in the hash.”; } ? delete expr: delete??? $hash{“key”};??? #从hash中删除指定的键和这个键对应的值,删除之后就不存在了。 ? ------------------------------------- perl中的上下文: ? 在标量上下文中使用产生列表的表达式: $num = @arr会自动转化为数组的个数。 sort在标量上下文返回undef值。 reverse在标量上下文中先将所有字符串连在一起然后再反序。 ? 在列表上下文中使用产生标量的表达式: 自动产生一个仅含一个标量值得列表即可。 ? 从列表上下文切换到标量上下文使用伪函数scalar: scalar(@arr);? ??#此处不是数组而是数组元素个数。 scalar??? @arr;???#同上?? ? 列表上下文中的<STDIN>: 在标量上下文中返回数据的下一行,也就是输入回车返回。 在列表上下文中返回所有行,直到文件结尾EOF或ctrl+d,每一行都是列表中的元素。 chomp(@lines =<STDIN>);??? #去掉每一行结尾的换行符。 ? -------------------------------------------- Perl操作符的优先级和结合性: ():括号操作符 ->: 方法调用 ++????? --:自增,自减, **:数值乘幂,右结合 ??????? !(逻辑非)???? ~(按位取反)????+(正)???-(负) : 单目操作符,右结合 =~????? !~ :绑定操作符 *?? /??%?? x : 数值乘、除、求余,字符串重复 +?? -??.? :数值加、减,字符串连接 <<?? >>??: 按位左移/右移 <?? <=??>?? >=?? lt??le?? gt?? ge:数值比较,字符串比较 ==??? !=???eq?? ne?? <=>??cmp?? : 数值相等、不等,字符串相等、不等 & :按位与 |?? ^ :按位或、异或 && : 逻辑与 || :逻辑或 //:逻辑否定 ?::三目操作符,右结合 =?? (…)=?:赋值和复合赋值,右结合 ,=>? : 分隔符 not :非,右结合 and : 与 or?? xor? :或、异或 ? 自增自减++/--: $count{$_}++?? foreach??@arr;?? #可以用来统计数组中字符串出现的次数。 foreach (@arr) { ??? print “$_n” ??????? if $seen{$_}++;?????? #可以查看arr数组中的重复出现的单词。 } ? 三目操作符?:: condition1 ? expression-true: expression-false ? 逻辑运算: !expr;?? #逻辑非 expr1? &&?expr2;???? #如果expr1为真才计算expr2,否则直接跳过expr2。 expr1? ||?expr2;??? #如果expr1为假才计算expr2,否则直接跳过expr2。 my? $val = $arg1 // $arg2;?? #逻辑否定,如果arg1是undef那么val=arg2,否则val=arg1。 ? 定长数据或记录的内建函数: "pack","read","syscall","sysread","sysseek","syswrite", "unpack","vec" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |