perl教程
第一节:
基本上,简单变量就是一个数据单元,这个单元可以是数字或字 符串。
一、整型
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 ", $value, "/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 = "T/LHIS 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 two/nlines of text/n";
.字符串和数值的互相转换 例1: $string = "43"; $number = 28; $result = $string + $number; # $result = 71 若字符串中含有非数字的字符,则从左起至第一个非数字的字符,如: $result = "hello" * 5; # $result = 0 $result = "12a34" +1; # $result = 13
.变量初始值 在PERL中,所有的简单变量都有缺省初始值:"",即空字符。但是建议给所有变量赋初值,否则当程序变得大而复杂后,很容易出现不可预料且很 难调试的错误。
第二节:
一、算术操作符 :+(加)、-(减)、*(乘)、/(除)、**(乘幂)、%(取余)、-(单目负)
< p>(1)乘幂的基数不能为负,如 (-5) ** 2.5 # error;
(2)乘幂结果不能超出计算机表示的限制,如10 ** 999999 # error
(3)取余的操作数如不是整数,四舍五入成整数后运算;运算符右侧不能为零
(4)单目负可用于变量: - $y ; # 等效于 $y * -1
二、整数比较操作符
Table 3.1. 整数比较操作符 < /tr>< /tr>< /tr>< /tr>
操作符 | 描述 | < | 小于 | > | 大于 | == | 等于 | <= | 小于等于 | >= | 大于等于 | != | 不等于 | <=> | 比较,返回 1, 0, or -1 操作符<=>结果为: 0 - 两个值相等 1 - 第一个值大 1 - 第二个值大 |
三、字符串比较操作符
Table 3.2. 字符串比较操作符
< /tr>< /tr>< /tr>< /tr>< /tr>< /tr>
操作符 | 描述 | lt | 小于 | gt | 大于 | eq | 等于 | le | 小于等于 | ge | 大于等于 | ne | 不等于 | cmp | 比较,返回 1, 0, 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. 赋值操作符例子
表达式 | 等效表达式< /td> | $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; | | < /td> |
.=可在一个赋值语句中出现 多次,如: $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. 操作符次序 < td>+, -, .< td>-e, -r, etc.< td>||< td>..< td>? and :
操作符 | 描述 | ++, -- | 自增,自减 | -, ~, ! | 单目 | **< /td> | 乘方 | =~, !~ | 模式匹配 | *, /, %, x | 乘,除,取余,重复 | 加,减,联接 | <<, >> | 移位 | 文件状态 | <, <=, >, >=, lt, le, gt, ge | 不等比较 | ==, !=, <=>, eq, ne, cmp | 相等比较 | & | 位与 | |, ^ | 位或,位异或 | && | 逻辑与 | 逻辑或 | 列表范围 | 条件操作符 | =, +=, -=, *=, | 赋值 | , | 逗号操作符 | not | Low-precedence logical NOT | and | Low-precedence logical AND | or, xor | Low-precedence logical OR and XOR | | < /td> |
》操作符结合性(associativity): Table 3.7. 操作符结合性
操作符 | 结合性 | ++, -- | 无 | -, ~, ! | Right-to-left | ** | Right-to-left | =~, !~ | Left-to-right | *, /, %, x | Left-to-right | +, -, . | Left-to-right | <<, >> | Left-to-right | -e, -r, | 无 | <, <=, >, >=, lt, le, gt, ge | Left-to-right | ==, !=, <=>, eq, ne, 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 | , | 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, 2, 3, 4); $scalar = $array[0]; $array[3] = 5; # now @array is (1,2,3,5) $scalar = $array[4]; # now $scalar = null; $array[6] = 17; # now @array is (1,2,3,5,"","",17)
》》数组间拷贝 @result = @original;
》》用数组给列表赋值 @list1 = (2, 3, 4); @list2 = (1, @list1, 5); # @list2 = (1, 2, 3, 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, $var2 = 7, $var3 ="" (null)
》》从标准输入(STDIN)给变量赋值 $var = ; @array = ; # ^D为结束输入的符号
2 、字符串中的方括号和变量替换 "$var[0]" 为数组@var的第一个元素。 "$var[0]" 将字符"["转义,等价于"$var". "[0]",$var被变量替换,[0]保持不变。 "${var}[0]" 亦等价于"$var" ."[0]"。 "${var}"则取消了大括号的变量替换功能,包含文字:${var}.
3、列表范围: (1..10) = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) (2, 5..7, 11) = (2, 5, 6, 7, 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, 2, 3); print (@array, "n"); 结果为: 123
(2) @array = (1, 2, 3); print ("@arrayn"); 结果为: 1 2 3
5、列表/数组的长度 当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。 @array = (1, 2, 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, 2, 3, 4, 5); @subarray = @array[0,1]; # @subarray = (1, 2) @subarray2 = @array[1..3]; # @subarray2 = (2,3,4) @array[0,1] = ("string", 46); # @array =("string",46,3,4,5) now @array[0..3] = (11, 22, 33, 44); # @array = (11,22,33,44,5) now @array[1,2,3] = @array[3,2,4]; # @array = (11,44,33,5,5) now @array[0..2] = @array[3,4]; # @array = (5,5,"",5,5) now
可以用子数组形式来交换元素: @array[1,2] = @array[2,1];
7、有关数组的库函数 (1)sort--按字符顺序排序 @array = ("this", "is", "a","test"); @array2 = sort(@array); # @array2 = ("a","is", "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", "is","a", "string"); # 结果为"this is a string" @list = ("words","and"); $string = join("::", @list, "colons"); #结果为"words::and::colons" @array = split(/::/,$string); # @array = ("words","and", "colons") now
第四节:
一、条件判断
if ( ) { } elsif ( ) { } ... else{ }
二、循环:
1、while循环 while ( ) { }
2、until循环 until ( ) { }
3、类C的for循环 ,如 for ($count=1; $count <= 5; $count++) { # statements inside the loop go here }
下面是在for循环中使用逗号操作符的例子: for ($line = , $count = 1; $count <= 3; $line = , $count++) { print ($line); } 它等价于下列语句: $line = ; $count = 1; while ($count <= 3) { print ($line); $line = ; $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, 2, 3, 4, 5); foreach $temp (@list) { if ($temp == 2) { $temp = 20; } } 此时@list已变成了(1, 20, 3, 4, 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); 虽然条件判断写在后面,但却是先执行的。
< /td> |