Perl程序设计中常用的函数

来源:互联网 发布:北大绩点算法 编辑:程序博客网 时间:2024/05/17 04:31

Perl 程序设计中常用的函数之一

print
printf
chop
split
exit
keys
values
reverse
sort
length
substr
index
push
pop
unshift

指令 :print

语法 :print Filehandle LIST

说明 :
这个 Filehandle 可以看作在 I(INPUT)/O(OUTPUT) 之间的一个桥梁 , 可以利用 FILEHANDLE 来做出数据读入写 出的动作 .STDIN 是代表从哪连输入数据 , 例如从电脑的键盘输入 ;STDOUT 是代表从哪连输出数据 ; 例如从电脑的屏 幕输出 ;STDERR 是代表从哪连输出错误的数据 , 例如从电脑的屏幕输出 . 而在 PERL 语言中有三个标准 FILEHANDLE:
1.STDIN(
标准输入 ): 是代表 STDIN FILEHANDLE

2.STDOUT(
标准输出 ): 是代表 STDOUT FILEHANDLE

3.STDERR(
标准错误输出 ): 是代表 STDERR FILEHANDLE 如果要使用其他 FILEHANDLE 的时候 , 就要用 OPEN 这个函数 来打开一个 FILEHANDLE, 我们可以用 PRINT 这个函数 LIST 的数据输出给 FILEHANDLE. 在为大家介绍 PRINT 这个函数 之前 , 先让我们来看看 PRINT 函数中特殊打印字符 :

符号 其作用
/n
换行 new line
/r
光标换行 return
/t tab

/f
换页 form feed
/b
退回一格
/v
垂直 tab
/a
响铃 Bell
/e escape

/007
十进制 ascii
/xff
十六进制码
/c[
控制字符

示例 :
print STDOUT"
足球世界 /n";

" 足球世界 " 加上换行显示在屏幕上 .

语法 : print LIST

说明 :
如果省略 Filehandle 的话 , 就会把 Filehandle 内定为 STDOUT. 也就是会将 LIST 的数据内容显示在屏幕上 .

示例 :
$url="www.netease.net/~peishan";
print"
足球世界 $url/n";
在屏幕上将会出现 " 足球世界 www.netease.net/~peishan", 如果想要让双引号内的变量失效 , 可以在变量 的前面加上 / 符号 .
例如 : print" 足球世界 /$url"; 这样它就显示 :" 足球世界 $url"

语法 : print

说明 :
同省略 Filehandle LIST 的话 , 就会以 STDOUT Filehandle, 并会输出 $_ 这个内定输出变量的数据内容 . 如果 $_ 变量是一个空字符串的话 , 就会显示出一个空字符串 .

示例 : $_=" 足球世界 /n"; print; 就会将 " 足球世界 " 加上换行显示在屏幕上指令 : printf

语法 :
printf Filehandle LIST

说明 :
perl 语言中也提代 C 语言中 printf 的语法 , 用法和 C 语言中的用法一模一样 . 如果把 Filehandle 省略的话 , 也一样会把 STDOUT 当成是内定的 Filehandle. 在为大家介绍 printf 函数之前 , 先让我们来看看 printf 数中变换符号的字符 .

符号 其作用
%c
字符
%s
字符串
%d
整数
%f
浮整数
%h
十六进制码
%o
八进制码


示例:
printf("chomod%d%s/n","711""cgi");
会将 chmod 711 cgi 加上换行显示于屏幕上。

指令: chop
语法: chop($url)

说明:
把最后一个字符删除。

示例:
$url="linux.cqi.com.cn/~milan/";
chop($url);
这时 $url="linux.cqi.com.cn/~milan" 而这两行也可以写成 chop($url="linux.cqi.com.cn/~milan/");

指令: split

语法:
split(/pattern/,$text,limit)
其中 /pattern 是文字处理的模式,而 limit 是代表要分割的个数,一般可以省略。

示例:
$text="Michael,Gevin,Mike";

@name=split(/,/,$text); #
这时 @name=("Michael","Gevin","Mike");
($a,$b,$c)=split(/,/,$text); #
这时 $a="Michael";$b="Gevin";$c="Mike";
$a,$b,$c)=split(/,/,$text); #
这时 $a="Michael";$b="Gevin";$c="Mike";
@name=split(/,/,$string,2); #
这时 @name=("Michael","Gevin");

在传送 CGI 应用程序数据的时候会先将数据编码,其中会将 FORM 中第个数葑侄 ? 的数据内容用 & 这个符号隔开,所以在解码的时候就要以 & 这个符号为分割的字 符,将每个数据字段分割出。例如:

$text="Mike=A&Michael=B";
@name=split(/&/,$text);
#
这时 @name=("Mike=A","Michael=B");

而数据字段的名称和这个数据字段的值是用 = 这个符号来隔开,如果想取得数据 字段的名称和所对应的值的话,就用要 = 这个符号来分割数据字段,例如:

$name="Mike=Michael"

($name1,$name2)=split(/=/,$list);
#
这时 $name1="Mike";$name2="Michael";

Perl 程序设计中常用的函数之三

指令: exit

语法: exit

说明:
退出执行的程序。

示例:
print"i love cgi/n";
exit;

显示完 "i love cgi" 以后,将退出这个程序。

指令: keys

语法: keys(%array)

说明:
取出关联数组 %ARRAY 中全部的 key

示例:
%NAME=(1,"mike",2,"michael");
@readkey=keys(%NAMES);----------------- #
这时 @readkey=(1,2);

指令: values

语法: values(%array)

说明:
取出关联数组 %ARRAY 中全部的 value

示例:
%NAMES=(1,"mike",2,"michael");
@readval=values(%NAMES); ---------------- #
这时 @readval=("mike","michael");

指令: reverse

语法: reverse(@array)

说明:
将数组 @array 中的元素由后到前重新排列。

示例:
@back=("A","B","C","D","E");
@back=reverse(@back);--------------------- #
这时 @back=("E","D","C","B","A");

指令: sort

语法: sort(@array)

说明:
将数组中的元素由小到大排序,如果要由大到小排序的话,要加上 reverse 这个函数。

示例:
@abc=("d","b","c","a");
@abc=sort(@abc); -------------------------- #
这时 @abc=("a","b","c","d");
@abc=(reverse sort@abc); --------------- #
这时 @abc=("d","c","b","a");
这个语法也可以写成 @abc=(reverse sort(@abc));
@number=(5,2,10);
@number=sort(@number);
上面示例用 sort 函数来排序数值的时,会出差错,因此要用下面到下面这一句。 @number=(sort{$a<=>$b}@number); -----------# 这时 @number=(2,5,10);

令: length

语法: length($string)

说明:
求出字符串 $string 的字节 (bytes) 值。

示例:
$string="Perl5";
$size=length($string); -----------------------#
这时 $size=5;

指令: substr

语法: substr($string,offset,length)
offset
代表起始字符的位置 ,length 代表引用的字符串长度,如果省略 length 则代表从起始值到字符串 的最后一个字符长度。而 offset 如果是负值的话,就会从字符串右边开始指定字符。

示例:
$s=substr("perl5",2,2);---------------------- #
这时 $s="rl";
$s=substr("perl5",2);------------------------- #
这时 $s="rl5";
$s=substr("perl5",-2,2);--------------------- #
这时 $s="er";

指令: index

语法: index($string,$substring,position)
$substring
是要寻找的字符; position 代表从哪一个位置开始寻找,假如省略 position 就从头开始找 起。

说明:
返回所要找寻的字符在一字符串 $string 中的位置,如果在字符串中找不到字符的话,则会返回 -1 这个 值。

示例:
$s=index("perl5","p"); ----------------------#
这时 $s=0
$s=index("perl5","l",2); -------------------- #
这时 $s=3
$s=index("perl5","perl"); -------------------#
这时 $s=-1

指令: push

语法: push(@array,$string)

说明:
在数组 @array 的最后附加新的元素 ($string) 到数组 @array 中。

示例:
@array=("one","two");
push(@array,"three"); ----------------------#
这时 $@array=("one","two","three")

指令: pop

语法: pop(@array)

说明:将数组 (@array) 的最后一个元素删除,并将删除的元素返回。

示例:
@array=("one","two");
$rm=pop(@array);---------------------- #
这时 @array=("one"); $rm="two";

指令: unshift

语法: unshift(@array,$string)

说明:在数组 @array 的第一个元素前附加新的元素 $string 到数组 @array 中。

示例:
@array=("one","two");
unshift(@array,"three"); -----------------#
这时 @array=("three","one","two")

Perl 语言的文字处理模式之一

Perl 语言的文字处理模式 (Regular Expression)

  如果在 Unix 中曾经使用过 sde awk grep 这些指令的话 , 相信对于 Perl 语言中的文字处理模式 (Regular Expression) 应该不会感到陌生才对。在 Perl 语言中因为有这个功能 , 所以对于字符串的处理能力是非常强有力的。 Regular Expression 可视为用来处理字符串的一种模式 (pattern), 其使用的格式为 /pattern/ 。在 Perl 语言的程序设计中 , 经常可以看得到类似语法的应用 , CGI 程序设计中也不例外。只要能够善用文字处理模式的话 , 要处理任何难的字 符串皆可迎刃而解 , 在本章中笔者会用深入浅出的方式来介绍 Regufar Expression 的用法。

一、文字处理 (RegularExpression) 的常用语法

  以下是文字处理模式中 ,/pattern/ 常用到的语法 :

   /pattern/ 说明除了换行字符 /n , 找寻只有一个字符的字符串 x? 找寻 0 个或是 1 x 字符 x* 找寻 0 个或是 0 个以上的 x 字符 .* 找寻 0 个或是 0 个以上的任何字符 x+ 找寻 1 个或是 1 个以上的 x 字符 .+ 找寻 1 个或是 1 个以上的任何字符 {m} 找寻刚好是 m 各个数指定的字符 {m,n} 找寻在 m 个个数以上、 n 个个数以下指定的字符 {m,} 找寻 m 个个数以上指定的字符 [] 找寻符合 [] 内的字符 [^] 找寻不符合 [] 内的字符 [0-9] 找寻符合 0 9 的任何一个字符 [a-z] 找寻符合 a z 的任何一个字符 [^0-9] 找寻不符合 0 9 的任何一个字符 [^a-z] 找寻不符合 a z 的任何一个字符 ^ 找寻字符串开头的字符 $ 找寻字符串结尾的字符 d 找寻一个 digit( 数字 ) 的字符 , [0-9] 语法一样 d+ 找寻一个 digit( 数字 ) 以上的字符串 , [0-9]+ 语法一样 D 找寻一个 non-digit( 非数字 ) 的字符 , [^0-9] 语法一样 D+ 找寻一个 non-digit( 非数字 ) 以上的字符串 , [^0-9]+ 语法一样 w 找寻一个英文字母或是数值的字符 , [a-zA-Z0-9] 语法一样 w+ 找寻一个以上英文字母或是数值的字符串 , [a-zA-Z0-9]+ 语法一样 W 找寻一个非英文字母或是数值的字符 , [^a-zA-Z0-9] 语法一样 W+ 找寻一个以上非英文字母或是数值的字符串 , [^a-zA-Z0-9]+ 语法一样 s 找寻一个空白的字符 , [ntrf] 一样 s+ 找寻一个以上空白的字符 , [ntrf]+ 一样 S 找寻一个非空白的字符 , [^ntrf] 一样 S+ 找寻一个以上非空白的字符 , [^ntrf]+ 一样 b 找寻一个不以英文字母、数值为边界的字符串 B 找寻一个以英文字母、数值为边界的字符串 a|b|c 找到符合 a 字符或是 b 字符或是 c 字符的字符串 abc 找到一个含有 abc 的字符串 (pattern)

   () 这个符号会记忆所找寻到的字符串 , 是一个很实用的语法 第一个 () 内所找到的字符串变成 $1 这个变量或是 1 变量 第二个 () 内所找到的字符串变成 $2 这个变量或是 2 变量 以此类推 , 笔者会在下一个小节中详细介绍它的用法 /pattern/i i 这个参数是代表忽略英文大小谢的意思 , 也就是在找寻字符串的时候 , 不会去考虑英文的大小写 如果要在 pattern 模式中找寻一个有特殊意义的字符 , 要在这个字符前加上这个符号 , 这样才会让这个特殊字符失效。二、文字处理模式 (RegularExpression) 的简单范例

  看了上一小节文字处理模式〈 RegularExpression) 之后 , 初学者对于这个语法的应用可能 还不是很清楚 , 所以笔者会在这一小节中 , 举出一些在文字处理模式中常用的范例给大家瞧瞧:

  范例说明 :

/perl/
找到含有 perl 的字符串 /^perl/ 找到开头是 perl 的字符串 /perl$/ 找到结尾是 perl 的字符串 /c|g|i/ 找到含有 c g i 的字符串 /cg{2,4}i/ 找到 c 后面跟着 2 个到 4 g, 再跟着 i 的字符串 /cg{2}i/ 找到 c 后面跟着 2 g, 再跟着 i 的字符串 /cg*i/ 找到 c 后面跟着 0 个或多个 g, 再跟着 i 的字符串 , 如同 /cg{0,}i/ /cg+i/ 找到 c 后面跟着一个以上的 g, 再跟着 i 的字符串 , 如同 /cg{1,}i/ /cg?i/ 找到 c 后面跟着 0 个或是一个 g, 再跟着 i 的字符串 , 如同 /cg{0,1}i/ /c.i/ 找到 c 后面跟着一个任意字符 , 再跟着 i 的字符串 /c..i/ 找到 c 后面跟着二个任意字符 , 再跟着 i 的字符串 /[cgi]/ 找到符合有这三个字符任意一个的字符串 /[^cgi]/ 找到没有有这三个字符任意一个的字符串 /d/ 找寻符合数值的字符串 可以使用 /d+/ 来表示一个或是个多个数值的字符串 /D/ 找寻符合不是数值的字符串 可以使用 /D+/ 来表示一个或是个多个非数值的字符串 /w/ 找寻符合英文字母、数值的字符串 可以使用 /w+/ 来表示一个或是个多个英文字母、数值的字符串 /W/ 找寻符合非英文字母、数值的字符串 可以使用 /W+/ 来表示一个或是个多个非英文字母、数值的字符串 /s/ 找寻符合空白的字符串 可以使用 /s+/ 来表示一个或是更多个空白字符的字符串 /S/ 找寻符合不是空白字符的字符串 可以使用 /S+/ 来表示一个或是更多不是空白的字符的字符串 /*/ 找寻符合 * 这个符号的字符串 , 因为 * 在文字处理模式中有它的特殊意思 , 所以要在这个特殊符号前加上这个符号 , 这样才会让这个特殊字符失效 /abc/i 找寻符合 abc 的字符串而且不考虑这些符合字符串的大小写三、文字处理模式 (Regular Expression) 相关的运算符及函数

  在 perl 程序写作中常会用到 =~ !~ 这两个运算符及 s tr 这二个函数来和文字处理模式 /pattern/ 搭配而成一个运算式 , 如果能够活用这些指令的话 , 就可以很轻易地来处理一些字符串,当然在 CGI 程序设计中也就更能得心应手了。现在就让作者来介绍这些运算符及函数的用法:

  --------------------------------------------------------------------------

指令 : /pattern/ 文字运算
说明 : 如果在文字运算中没有使用 =~ 或是 !~ 运算符指定一个字符串来做运算的话 , 就会
使用内定的输出变量 $_ 来做 /pattern/ 文字运算。

范例一 :
   $string="chmod7llcgi";
   $string=~/(w+)s+(d+)/;
  第一个 (w+) 是代表找寻数个字母,并将所找到的字符串指派给 $l 这个变量 , s+
找寻多个空白的字符串 , 最后 (d+) 代表找寻数个数值 , 并将所找到的字符串指派给
$2
个变量。所以 $l="chmod",$2=71l, 但是 $string 还是等于原来的字符串 , 没有改变。

范例二 :
   $_="chmod71lcgi";
   /(w+)s+(d+)/;
  因为是把字符串指定给 $_ 这个变量 , 所以可以不用 =~ 这个运算符就会得到
$l="chmod", $2=711;
而且 $_ 还是等于原来的字符串 , 没有改变。

范例三 :
   $string="chmod71lcgi";
   @list=split(/s+/,$string);
  以一个或是多个空白字符来分割 $string 这个字符串 , 这是一个很常用的语法。此时
   @list=("chmod","7ll","cgi");
  -------------------------------------------------------------------------- 指令 : =~ 相配运算符
说明 : 这是 Perl 语言中特有的语法 , 通常会和文字处理模式来作运算。

范例 :
   print" 请输入一个字符串 !n";
   $string=<>;   #<> 代表标准输入 , 会让使用者输入一字符串
   chop($string);    # $string 最后一个换行的字符 n 删除掉
   if($string=~/cgi/){  
    print" 输入的字符串中有 cgi 这个字符串 !n";
   }
  如果输入的字符串中含有 cgi 这个字符串的话 , 就会显示出这个信息。
  --------------------------------------------------------------------------

指令 :!~ 不相配运算符
说明 : 这也是 Perl 语言中特有的语法 , 通常会和文字处理模式来作运算。

范例 :
   print" 请输入一个字符串 !n";
   $string=<>;   #<> 代表标准输入 , 会让使用者输入一字符串
   chop($string);    # $stdng 最后一个换行的字符 n 删除掉
   if($string!~/cgi/){
     print" 输入的字符串中没有 cgi 这个字符串 !n";
   }
  如果输入的字符串中没有含有 cgi 这个字符串的话 , 就会显示出这个信息。
 指令 :tr 转换函数
语法 :tr/SEARCHLIST/REPLACELIST/
  其中 SEARCHLIST 是要转换的字符 ,REPLACELIST 是转换成何种字符。
说明 :tr(translate) 就是转换的意思 , 会把符合转换的字符转换成要转换的字符。

范例一 :
   $string="test1ng";
   $string=~tr/et/ET/;# 此时 $string="TEsTing";
   $string=~tr/a-z/A-Z/;# 此时 $string="TESTING";

范例二 :
   $string="CGI+Perl";
   $string=~tr/+//;# 此时 $string="CGI Perl";
  在传送 CGI 数据的时候会先将数据编码 , 其中会将空白的字符转成 + 这个字符 , 所以
解码的时候要把 + 这个字符还原成空白的字符。指令 :s 取代函数
语法 :s/PATTERN/REPLACE/eg

  其中 PATTERN 是文字处理 (Regular Expression) 的模式 ,REPLACE 是代表取代成何种文
模式。而 g 是这个函数最常用的参数 , 代表要把所有符合文字模式的字符串 全部取
, 如果省略这个参数的话 , 则只取代一个符合文字模式的字符串 ; 而加上 e 个参数是代
表要将 REPLACE 的部分当成一个运算式 , 如果没有这个需要的话 , 就不用加 上这个参数。
说明 : 将符合文字处理模式的字符串取代成为要取代的字符串。

范例一 :
   $string="i;love;perl";
   $string=~s/:/*/ :    # 此时 $string="i*love:perl";
   $string=~s/:/*/g;     # 此时 $string="i*love*perl";
   $stiing=~s/*/+/g;     # 此时 $string="i+love+perl";
   $string=~s/+//g :    # 此时 $string="i love perl";
  上一行也可写成 $string=~tr/+//; 效果都会一样哦 !
   $string=~s/per1/cgi/;   # 此时 $string="i love cgi";

范例二 :
   $string="i love per";
   $string=~s/(love)/<$1>/;
  第一个 () 内所找到的字符串变成 $1, 在这个范例中 , 会把变量 love 这个字符串变成
<>,
此时 $string="i<>perl";
   $string="i love per1";
   $string=~s/(i)(perl)/<$1><$2>/;
  在这个范例中 , 会把 i 变成 <>,perl 变成 <> 此时 $string="<>love<>";
   $striag="i love per1";
   $string=~s/(w+)/<$1>/g;

   (w+) 代表找寻符合一个或是多个英文字符或是数值的字符串 , 之后再将找到的字 符串设成 $l 。因为加上 g 这个参数 , 所以会找到字符串中的这三个英文单字 , 然后 再把这三个单字分别加上 <> 这个符号 , 此时 $string="<><><>"; 范例三 :
   $string="ww22cgi44";
   $string=~s/(d+)/$1*2/e;
   (d+) 代表要找寻 $string 中一个或是多个数值的字符串 , 再将找到的字符串设成
$1
。加上参数 e 是代表要把 $l*2 当作是一个运算式 , 所以 $string="www44cgi44";
   $string="www22cgi44";
   $string=~s/(d+)/$1*2/eg;
  加上参数 e, 所以会把 $1*2 当作是一个运算式来看 , 加上参数 g 就会把全部符合数
的字符串经过运算式运算之后再把它取代 , 所以 $string="www44cgi88";

范例四 :
  假设原本的字符串是 $value=" 三八 !", CGI 数据编码之后 , 这个字符串就会变成
$value="%A4T%A4K%21"
。以下是一个解码的示范程序 :
   $value="%A4T%A4K%2l"
   $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($l))/eg;

  在传送 CGI 数据的时候会把数据编码 , 其中会将特殊字符或是中文字符编码成以 % 开头的连续两个十六进制数的字符串 , 所以要用 s 这个函数来找寻这个以 % 开头的 字符串。为了要把找到的字符串再做解码的处理 , 所以要在 % 这个符号之后加上 () 这个符号 , 表示会把找到的字符串记忆起来并指定给 $1 这个变量 , 而且要在 () 中加上代表是连续两个十六进制数值的文字处理模式 (Regular Expression), 就是 [a-fA-F0-9][a-fA-F0-9] 。再用 hex 这个函数 ($1 是代表符合的字符串 ) 把十 六进制数值转成十进制的码 , 之后再用 pack 这个函数 ( C 为参数 , 是代表 unsigned char value 的意思 ) 把这个十进制码还原成原来的字符串。最后就会 把这个字符串解码成 $value=" 三八 !" 。值得一提的是也可以把这个解码的程序 写成 :

   $value=~s/%(..)/pack("C",hex($l))/eg;

原创粉丝点击