第一节: 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串。 一、整型 1、整型 PERL最常用的简单变量,由于其与其它语言基本相同,不再赘述。 例: $x = 12345; if (1217 + 116 == 1333) { # statement block goes here } 整型的限制: PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。在多数计算机中,浮点寄存器可以存贮约16位数字,长于此的被丢弃。整数实为浮点数的特例。 2、8进制和16进制数 8进制以0打头,16进制以0x打头。 例:$var1 = 047; (等于十进制的39) $var2 = 0x1f; (等于十进制的31) 二、浮点数 如 11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03 浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。指数的范围通常为-309到+308。 例: #!/usr/local/bin/perl $value = 9.01e+21 + 0.01 - 9.01e+21; print ("first value is ",$value,"n"); $value = 9.01e+21 - 9.01e+21 + 0.01; print ("second value is ","n"); $ program3_3 first value is 0 second value is 0.01 三、字符串 惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL字符可以出现在串的任何位置。 . 双引号内的字符串中支持简单变量替换,例如: $number = 11; $text = "This text contains the number $number."; 则$text的内容为:"This text contains the number 11." .双引号内的字符串中支持转义字符 Table 3.1. Escape sequences in strings. Escape Sequence Description a Bell (beep) b Backspace cn The Ctrl+n character e Escape E Ends the effect of L,U or Q f Form feed l Forces the next letter into lowercase L All following letters are lowercase n Newline r Carriage return Q Do not look for special pattern characters t Tab u Force next letter into uppercase U All following letters are uppercase v Vertical tab L、U、Q功能可以由E关闭掉,如: $a = "TLHIS IS A ESTRING"; # same as "This is a STRING" .要在字符串中包含双引号或反斜线,则在其前加一个反斜线,反斜线还可以取消变量替换,如: $res = "A quote " and A backslash "; $result = 14; print ("The value of $result is $result.n")的结果为: The value of $result is 14. .可用nnn(8进制)或xnn(16进制)来表示ASCII字符,如: $result = "377"; # this is the character 255,or EOF $result = "xff"; # this is also 255 .单引号字符串 单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符,而只在包含单引号和反斜线时起作用。单引号另一个特性是可以跨多行,如: $text = 'This is two lines of text '; 与下句等效: $text = "This is twonlines of textn"; .字符串和数值的互相转换 例1: $string = "43"; $number = 28; $result = $string + $number; # $result = 71 若字符串中含有非数字的字符,则从左起至第一个非数字的字符,如: $result = "hello" * 5; # $result = 0 $result = "12a34" +1; # $result = 13 .变量初始值 在PERL中,所有的简单变量都有缺省初始值:"",即空字符。但是建议给所有变量赋初值,否则当程序变得大而复杂后,很容易出现不可预料且很难调试的错误。 第二节: 一、算术操作符 :+(加)、-(减)、*(乘)、/(除)、**(乘幂)、%(取余)、-(单目负) (1)乘幂的基数不能为负,如 (-5) ** 2.5 # error; (2)乘幂结果不能超出计算机表示的限制,如10 ** 999999 # error (3)取余的操作数如不是整数,四舍五入成整数后运算;运算符右侧不能为零 (4)单目负可用于变量: - $y ; # 等效于 $y * -1 二、整数比较操作符 Table 3.1. 整数比较操作符 操作符 描述 < 小于 > 大于 == 等于 <= 小于等于 >= 大于等于 != 不等于 <=> 比较,返回 1,or -1 操作符<=>结果为: 0 - 两个值相等 1 - 第一个值大 1 - 第二个值大 三、字符串比较操作符 Table 3.2. 字符串比较操作符 操作符 描述 lt 小于 gt 大于 eq 等于 le 小于等于 ge 大于等于 ne 不等于 cmp 比较,返回 1,or -1 四、逻辑操作符 逻辑或:$a || $b 或 $a or $b 逻辑与:$a && $b 或 $a and $b 逻辑非:! $a 或 not $a 逻辑异或:$a xor $b 五、位操作符 位与:& 位或:| 位非:~ 位异或:^ 左移:$x << 1 右移:$x >> 2 注:不要将&用于负整数,因为PERL将会把它们转化为无符号数。 六、赋值操作符 Table 3.3. 赋值操作符 操作符 描述 = Assignment only += Addition and assignment -= Subtraction and assignment *= Multiplication and assignment /= Division and assignment %= Remainder and assignment **= Exponentiation and assignment &= Bitwise AND and assignment |= Bitwise OR and assignment ^= Bitwise XOR and assignment Table 3.4. 赋值操作符例子 表达式 等效表达式 $a = 1; none (basic assignment) $a -= 1; $a = $a - 1; $a *= 2; $a = $a * 2; $a /= 2; $a = $a / 2; $a %= 2; $a = $a % 2; $a **= 2; $a = $a ** 2; $a &= 2; $a = $a & 2; $a |= 2; $a = $a | 2; $a ^= 2; $a = $a ^ 2; .=可在一个赋值语句中出现多次,如: $value1 = $value2 = "a string"; .=作为子表达式 ($a = $b) += 3; 等价于 $a = $b; $a += 3; 但建议不要使用这种方式。 七、自增自减操作符 :++、--(与C++中的用法相同) .不要在变量两边都使用此种操作符:++$var-- # error .不要在变量自增/减后在同一表达式中再次使用:$var2 = $var1 + ++$var1; # error .在PERL中++可用于字符串,但当结尾字符为'z'、'Z'、'9'时进位,如: $stringvar = "abc"; $stringvar++; # $stringvar contains "abd" now $stringvar = "aBC"; $stringvar++; # $stringvar contains "aBD" now $stringvar = "abz"; $stringvar++; # $stringvar now contains "aca" $stringvar = "AGZZZ"; $stringvar++; # $stringvar now contains "AHAAA" $stringvar = "ab4"; $stringvar++; # $stringvar now contains "ab5" $stringvar = "bc999"; $stringvar++; # $stringvar now contains "bd000" .不要使用--,PERL将先将字符串转换为数字再进行自减 $stringvar = "abc"; $stringvar--; # $stringvar = -1 now .如果字符串中含有非字母且非数字的字符,或数字位于字母中,则经过++运算前值转换为数字零,因此结果为1,如: $stringvar = "ab*c"; $stringvar++; $stringvar = "ab5c"; $stringvar++; 八、字符串联结和重复操作符 联接: . 重复:x 联接且赋值(类似+=): .= 例: $newstring = "potato" . "head"; $newstring = "t" x 5; $a = "be"; $a .= "witched"; # $a is now "bewitched" 九、逗号操作符 其前面的表达式先进行运算,如: $var1 += 1,$var2 = $var1; 等价于 $var1 += 1; $var2 = $var1; 使用此操作符的唯一理由是提高程序的可读性,将关系密切的两个表达式结合在一起,如: $val = 26; $result = (++$val,$val + 5); # $result = 32 注意如果此处没有括号则意义不同: $val = 26; $result = ++$val,$val + 5; # $result = 27 十、条件操作符 与C中类似,条件?值1:值2,当条件为真时取值1,为假时取值2,如: $result = $var == 0 ? 14 : 7; $result = 43 + ($divisor == 0 ? 0 : $dividend / $divisor); PERL 5中,还可以在赋值式左边使用条件操作符来选择被赋值的变量,如: $condvar == 43 ? $var1 : $var2 = 14; $condvar == 43 ? $var1 = 14 : $var2 = 14; 十一、操作符的次序 Table 3.6. 操作符次序 操作符 描述 ++,-- 自增,自减 -,~,! 单目 ** 乘方 =~,!~ 模式匹配 *,/,%,x 乘,除,取余,重复 +,-,. 加,减,联接 <<,>> 移位 -e,-r,etc. 文件状态 <,<=,>,>=,lt,le,gt,ge 不等比较 ==,!=,<=>,eq,ne,cmp 相等比较 & 位与 |,^ 位或,位异或 && 逻辑与 || 逻辑或 .. 列表范围 ? and : 条件操作符 =,+=,-=,*=,赋值 and so on ,逗号操作符 not Low-precedence logical NOT and Low-precedence logical AND or,xor Low-precedence logical OR and XOR .操作符结合性(associativity): Table 3.7. 操作符结合性 操作符 结合性 ++,-- 无 -,! Right-to-left ** Right-to-left =~,!~ Left-to-right *,x Left-to-right +,. Left-to-right <<,>> Left-to-right -e,无 <,ge Left-to-right ==,cmp Left-to-right & Left-to-right |,^ Left-to-right && Left-to-right || Left-to-right .. Left-to-right ? and : Right-to-left =,Right-to-left and so on ,Left-to-right not Left-to-right and Left-to-right or,xor Left-to-right 建议: 1、当你不确定某操作符是否先执行时,一定要用括号明确之。 2、用多行、空格等方式提高程序的可读性 第三节: 一、列表 列表是包含在括号里的一序列的值,可以为任何数值,也可为空,如:(1,5.3,"hello",2),空列表:()。 注:只含有一个数值的列表(如:(43.2) )与该数值本身(即:43.2 )是不同的,但它们可以互相转化或赋值。 列表例: (17,$var,"a string") (17,26 << 2) (17,$var1 + $var2) ($value,"The answer is $value") 二、数组--列表的存贮 列表存贮于数组变量中,与简单变量不同,数组变量以字符"@"打头,如: @array = (1,2,3); 注: (1)数组变量创建时初始值为空列表:()。 (2)因为PERL用@和$来区分数组变量和简单变量,所以同一个名字可以同时用于数组变量和简单变量,如: $var = 1; @var = (11,27.1,"a string"); 但这样很容易混淆,故不推荐。 1、数组的存取 .对数组中的值通过下标存取,第一个元素下标为0。试图访问不存在的数组元素,则结果为NULL,但如果给超出数组大小的元素赋值,则数组自动增长,原来没有的元素值为NULL。如: @array = (1,3,4); $scalar = $array[0]; $array[3] = 5; # now @array is (1,5) $scalar = $array[4]; # now $scalar = null; $array[6] = 17; # now @array is (1,5,"",17) .数组间拷贝 @result = @original; .用数组给列表赋值 @list1 = (2,4); @list2 = (1,@list1,5); # @list2 = (1,4,5) .数组对简单变量的赋值 (1) @array = (5,7,11); ($var1,$var2) = @array; # $var1 = 5,$var2 = 7,11被忽略 (2) @array = (5,7); ($var1,$var2,$var3) = @array; # $var1 = 5,$var3 ="" (null) .从标准输入(STDIN)给变量赋值 $var = <STDIN>; @array = <STDIN>; # ^D为结束输入的符号 2 、字符串中的方括号和变量替换 "$var[0]" 为数组@var的第一个元素。 "$var[0]" 将字符"["转义,等价于"$var". "[0]",$var被变量替换,[0]保持不变。 "${var}[0]" 亦等价于"$var" ."[0]"。 "${var}"则取消了大括号的变量替换功能,包含文字:${var}. 3、列表范围: (1..10) = (1,6,8,9,10) (2,5..7,11) = (2,11) (3..3) = (3) .用于实数 (2.1..5.3) = (2.1,3.1,4.1,5.1) (4.5..1.6) = () .用于字符串 ("aaa".."aad") = ("aaa","aab","aac","aad") @day_of_month = ("01".."31") .可包含变量或表达式 ($var1..$var2+5) .小技巧: $fred = "Fred"; print (("Hello," . $fred . "!n") x 2); 其结果为: Hello,Fred! Hello,Fred! 4、数组的输出: (1) @array = (1,3); print (@array,"n"); 结果为: 123 (2) @array = (1,3); print ("@arrayn"); 结果为: 1 2 3 5、列表/数组的长度 当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。 @array = (1,3); $scalar = @array; # $scalar = 3,即@array的长度 ($scalar) = @array; # $scalar = 1,即@array第一个元素的值 注:以数组的长度为循环次数可如下编程: $count = 1; while ($count <= @array) { print ("element $count: $array[$count-1]n"); $count++; } 6、子数组 @array = (1,5); @subarray = @array[0,1]; # @subarray = (1,2) @subarray2 = @array[1..3]; # @subarray2 = (2,4) @array[0,1] = ("string",46); # @array =("string",46,5) now @array[0..3] = (11,22,33,44); # @array = (11,44,5) now @array[1,3] = @array[3,4]; # @array = (11,5) now @array[0..2] = @array[3,4]; # @array = (5,5) now 可以用子数组形式来交换元素: @array[1,2] = @array[2,1]; 7、有关数组的库函数 (1)sort--按字符顺序排序 @array = ("this","is","a","test"); @array2 = sort(@array); # @array2 = ("a","test","this") @array = (70,100,8); @array = sort(@array); # @array = (100,70,8) now ( 2)reverse--反转数组 @array2 = reverse(@array); @array2 = reverse sort (@array); (3)chop--数组去尾 chop的意义是去掉STDIN(键盘)输入字符串时最后一个字符--换行符。而如果它作用到数组上,则将数组中每一个元素都做如此处理。 @list = ("rabbit","12345","quartz"); chop (@list); # @list = ("rabbi","1234","quart") now ( 4)join/split--连接/拆分 join的第一个参数是连接所用的中间字符,其余则为待连接的字符数组。 $string = join(" ","this","string"); # 结果为"this is a string" @list = ("words","and"); $string = join("::",@list,"colons"); #结果为"words::and::colons" @array = split(/::/,$string); # @array = ("words","and","colons") now 第四节: 一、条件判断 if ( <expression>) { <statement_block_1> } elsif ( <expression> ) { <statement_block_2> } ... else{ <statement_block_3> } 二、循环: 1、while循环 while ( <expression> ) { <statement_block> } 2、until循环 until ( <expression> ) { <statement_block> } 3、类C的for循环 ,如 for ($count=1; $count <= 5; $count++) { # statements inside the loop go here } 下面是在for循环中使用逗号操作符的例子: for ($line = <STDIN>,$count = 1; $count <= 3; $line = <STDIN>,$count++) { print ($line); } 它等价于下列语句: $line = <STDIN>; $count = 1; while ($count <= 3) { print ($line); $line = <STDIN>; $count++; } 4、针对列表(数组)每个元素的循环:foreach,语法为: foreach localvar (listexpr) { statement_block; } 例: foreach $word (@words) { if ($word eq "the") { print ("found the word 'the'n"); } } 注: (1)此处的循环变量localvar是个局部变量,如果在此之前它已有值,则循环后仍恢复该值。 (2)在循环中改变局部变量,相应的数组变量也会改变,如: @list = (1,5); foreach $temp (@list) { if ($temp == 2) { $temp = 20; } } 此时@list已变成了(1,20,5)。 5、do循环 do { statement_block } while_or_until (condexpr); do循环至少执行一次循环。 6、循环控制 退出循环为last,与C中的break作用相同;执行下一个循环为next,与C中的continue作用相同;PERL特有的一个命令是redo,其含义是重复此次循环,即循环变量不变,回到循环起始点,但要注意,redo命令在do循环中不起作用。 7、传统的goto label;语句。 三、单行条件 语法为statement keyword condexpr。其中keyword可为if、unless、while或until,如: print ("This is zero.n") if ($var == 0); print ("This is zero.n") unless ($var != 0); print ("Not zero yet.n") while ($var-- > 0); print ("Not zero yet.n") until ($var-- == 0); 虽然条件判断写在后面,但却是先执行的。 第五节: 一、定义 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读。PERL中,子程序可以出现在程序的任何地方。定义方法为: sub subroutine{ statements; } 二、调用 调用方法如下: 1、用&调用 &subname; ... sub subname{ ... } 2、先定义后调用 ,可以省略&符号 sub subname{ ... } ... subname; 3、前向引用 ,先定义子程序名,后面再定义子程序体 sub subname; ... subname; ... sub subname{ ... } 4、用do调用 do my_sub(1,3);等价于&my_sub(1,3); 三、返回值 缺省的,子程序中最后一个语句的值将用作返回值。语句return (retval);也可以推出子程序并返回值retval,retval可以为列表。 四、局部变量 子程序中局部变量的定义有两种方法:my和local。其区别是:my定义的变量只在该子程序中存在;而local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中(在PERL4中没有my)。定义时可以给其赋值,如: my($scalar) = 43; local(@array) = (1,3); 五、子程序参数传递 1、形式 &sub1(&number1,$number2,$nubmer3); ... sub sub1{ my($number1,$number3) = @_; ... } 2、传送数组 &addlist (@mylist); &addlist ("14","6","11"); &addlist ($value1,@sublist,$value2); ... sub addlist { my (@list) = @_; ... } 参数为数组时,子程序只将它赋给一个数组变量。如 sub twolists { my (@list1,@list2) = @_; } 中@list2必然为空。但简单变量和数组变量可以同时传递: &twoargs(47,@mylist); # 47赋给$scalar,@mylist赋给@list &twoargs(@mylist); # @mylist的第一个元素赋给$scalar,其余的元素赋给@list ... sub twoargs { my ($scalar,@list) = @_; ... } 六、递归子程序 PERL中,子程序可以互相调用,其调用方法与上述相同,当调用该子程序本身时,即成了递归子程序。递归子程序有两个条件:1、除了不被子程序改变的变量外,所有的变量必须的局部的;2、该子程序要含有停止调用本身的代码。 七、用别名传递数组参数 1、用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程序中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如: @myarray = (1,5); &my_sub(*myarray); sub my_sub { my (*subarray) = @_; } 2、此方法类似于C语言中的传递数组的起始地址指针,但并不一样,在定义数组的别名之后,如果有同名的简单变量,则对该变量也是起作用的。如: $foo = 26; @foo = ("here's","list"); &testsub (*foo); ... sub testsub { local (*printarray) = @_; ... $printarray = 61; } 当子程序执行完,主程序中的$foo的值已经成了61,而不再是26了。 3、用别名的方法可以传递多个数组,如: @array1 = (1,3); @array2 = (4,6); &two_array_sub (*array1,*array2); sub two_array_sub { my (*subarray1,*subarray2) = @_; } 在该子程序中,subarray1是array1的别名,subarray2是array2的别名。 八、预定义的子程序 PERL5预定义了三个子程序,分别在特定的时间执行,它们是:BEGIN子程序在程序启动时被调用;END子程序在程序结束时被调用;AUTOLOAD子程序在找不到某个子程序时被调用。你可以自己定义它们,以在特定时间执行所需要的动作。如: BEGIN { print("Hi! Welcome to Perl!n"); } AUTOLOAD{ print("subroutine $AUTOLOAD not foundn"); # 变量$AUTOLOAD即未找到的子程序名 print("arguments passed: @_n"); } 若同一个预定义子程序定义了多个,则BEGIN顺序执行,END逆序执行。 |
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|