| 查看: 1556 | 回复: 8 | |||||
| 当前主题已经存档。 | |||||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | |||||
miRNA至尊木虫 (职业作家)
水王之王(愚愚学园管理员)
|
[交流]
perl 5 教程 连载
|
||||
|
第一章 概述 一、Perl是什么? Perl是Practical Extraction and Report Language的缩写,它是由Larry Wall设计的,并由他不断更新和维护,用于在UNIX环境下编程。 .Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。 .与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。 .Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。Perl还支持sed到Perl及awd到Perl的翻译器。 简而言之,Perl象C一样强大,象awk、sed等脚本描述语言一样方便。 二、Perl在哪里? Perl通常位于/usr/local/bin/perl或/usr/bin/perl中。你可以在Internet用匿名FTP免费得到它,如ftp://prep.ai.mit.edu/pub/gnu/perl-5.004.tar.gz。 安装过程为: (1)解压: $gunzip perl-5.004.tar.gz $tar xvf - $make makefile (3)放置: 将编译生成的可执行文件拷贝到可执行文件通常所在目录,如: $copy 注:这需要系统管理员权限。 北美 地址目录 ftp.netlabs.comIP地址:192.94.48.152 目录 /pub/outgoing/perl5.0 ftp.cis.ufl.eduIP地址: 128.227.100.198 目录 /pub/perl/src/5.0 ftp.uu.netIP地址: 192.48.96.9 目录 /languages/perl ftp.khoros.unm.eduIP地址: 198.59.155.28 目录 /pub/perl ftp.cbi.tamucc.eduIP地址: 165.95.1.3 目录 /pub/duff/Perl ftp.metronet.comIP地址: 192.245.137.1 目录 /pub/perl/sources genetics.upenn.eduIP地址: 128.91.200.37 目录 /perl5 欧洲 SiteLocation ftp.cs.ruu.nlIP地址: 131.211.80.17 目录 /pub/PERL/perl5.0/src ftp.funet.fiIP地址: 128.214.248.6 目录 /pub/languages/perl/ports/perl5 ftp.zrz.tu-berlin.deIP地址: 130.149.4.40 目录 /pub/unix/perl src.doc.ic.ac.ukIP地址: 146.169.17.5 目录 /packages/perl5 澳洲 SiteLocation sungear.mame.mu.oz.auIP地址: 128.250.209.2 目录 /pub/perl/src/5.0 南美 SiteLocation ftp.inf.utfsm.clIP地址: 146.83.198.3 目录 /pub/gnu 三、运行 用文本编辑器编辑好你的Perl程序,加上可执行属性:$chmod +x 注:你的程序的第一行必须为#!/usr/local/bin/perl(perl所在位置)。 四、注释: 注释的方法为在语句的开头用字符#,如: # this line is a comment 注:建议经常使用注释使你的程序易读,这是好的编程习惯。 第二章 简单变量 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串。 一、整型 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 ", $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 SequenceDescription \aBell (beep) \bBackspace \cnThe Ctrl+n character \eEscape \EEnds the effect of \L, \U or \Q \fForm feed \lForces the next letter into lowercase \LAll following letters are lowercase \nNewline \rCarriage return \QDo not look for special pattern characters \tTab \uForce next letter into uppercase \UAll following letters are uppercase \vVertical 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中,所有的简单变量都有缺省初始值:"",即空字符。但是建议给所有变量赋初值,否则当程序变得大而复杂后,很容易出现不可预料且很难调试的错误。(未完) [ Last edited by 幻影无痕 on 2006-11-12 at 08:31 ] |
» 收录本帖的淘帖专辑推荐
先进材料与分子模拟 | perl语言专栏 |
» 猜你喜欢
AI论文写作工具:是科研加速器还是学术作弊器?
已经有4人回复
寻求一种能扛住强氧化性腐蚀性的容器密封件
已经有7人回复
到新单位后,换了新的研究方向,没有团队,持续积累2区以上论文,能申请到面上吗
已经有8人回复
申请2026年博士
已经有6人回复
请问哪里可以有青B申请的本子可以借鉴一下。
已经有5人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有5人回复
2025冷门绝学什么时候出结果
已经有7人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有6人回复
Bioresource Technology期刊,第一次返修的时候被退回好几次了
已经有7人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复

miRNA
至尊木虫 (职业作家)
水王之王(愚愚学园管理员)
- 应助: 0 (幼儿园)
- 贵宾: 16.6
- 金币: 13289.9
- 红花: 4
- 帖子: 4967
- 在线: 10.3小时
- 虫号: 56231
- 注册: 2005-01-07
- 专业: 金属有机化学
|
附录: 一、进程处理函数 1、进程启动函数 函数名eval 调用语法eval(string) 解说将string看作Perl语句执行。 正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息。 例子$print = "print (\"hello,world\\n\");"; eval ($print); 结果输出hello, world 函数名system 调用语法system(list) 解说list中第一个元素为程序名,其余为参数。 system启动一个进程运行程序并等待其结束,程序结束后错误代码左移八位成为返回值。 例子@proglist = ("echo", "hello,world!"); system(@proglist); 结果输出hello, world! 函数名fork 调用语法procid = fork(); 解说创建程序的两个拷贝--父进程和子进程--同时运行。子进程返回零,父进程返回非零值,此值为子程序的进程ID号。 例子$retval = fork(); if ($retval == 0) { # this is the child process exit; # this terminates the child process } else { # this is the parent process } 结果输出无 函数名pipe 调用语法pipe (infile, outfile); 解说与fork合用,给父进程和子进程提供通信的方式。送到outfile文件变量的信息可以通过infile文件变量读取。步骤: 1、调用pipe 2、用fork将程序分成父进程和子进程 3、一个进程关掉infile,另一个关掉outfile 例子pipe (INPUT, OUTPUT); $retval = fork(); if ($retval != 0) { # this is the parent process close (INPUT); print ("Enter a line of input:\n"); $line = print OUTPUT ($line); } else { # this is the child process close (OUTPUT); $line = ; print ($line); exit (0); } 结果输出$ program Enter a line of input: Here is a test line Here is a test line $ 函数名exec 调用语法exec (list); 解说与system类似,区别是启动新进程前结束当前程序。常与fork合用,当fork分成两个进程后,子进程用exec启动另一个程序。 例子 结果输出 函数名syscall 调用语法syscall (list); 解说调用系统函数,list第一个元素是系统调用名,其余为参数。 如果参数是数字,就转化成C的整型数(type int)。否则传递字符串的指针。详见UNIX的帮助或Perl文档。 使用syscall必须包含文件syscall.pl,即: require ("syscall.ph"); 例子 结果输出 2、进程终止函数 函数名die 调用语法die (message); 解说终止程序并向STDERR输出错误信息。message可以为字符串或列表。如果最后一个参数不包含换行符,则程序文件名和行号也被输出。 例子die ("Cannot open input file"); 结果输出Cannot open input file at myprog line 6. 函数名warn 调用语法warn (message); 解说与die类似,区别是不终止程序。 例子warn("Danger! Danger!\n"); 结果输出Danger! Danger! 函数名exit 调用语法exit (retcode); 解说终止程序并指定返回值。 例子exit(2); 结果输出无 函数名kill 调用语法kill (signal, proclist); 解说给一组进程发送信号。 signal是发送的数字信号,9为杀掉进程。 proclist是进程ID列表。详见kill的UNIX帮助。 例子 结果输出 3、进程控制函数 函数名sleep 调用语法sleep (time); 解说将程序暂停一段时间。time是停止的秒数。返回值为实际停止的秒数。 例子sleep (5); 结果输出无 函数名wait 调用语法procid = wait(); 解说暂停程序执行,等待子进程终止。 不需要参数,返回值为子进程ID,如果没有子进程,返回-1。 例子 结果输出 函数名waitpid 调用语法waitpid (procid, waitflag); 解说暂停程序执行,等待特定的子进程终止。procid为等待的进程ID 例子$procid = fork(); if ($procid == 0) { # this is the child process print ("this line is printed first\n"); exit(0); } else { # this is the parent process waitpid ($procid, 0); print ("this line is printed last\n"); } 结果输出$ program this line is printed first this line is printed last $ 4、其它控制函数 函数名caller 调用语法subinfo = caller(); 解说返回调用者的程序名和行号,用于Perl Debugger。 返回值为三元素的列表: 1、调用处的包名 2、调用者文件名 3、调用处的行号 例子 结果输出 函数名chroot 调用语法chroot (dir); 解说改变程序的根目录,详见chroot帮助。 例子 结果输出 函数名local 调用语法local($variable); 解说在语句块(由大括号包围的语句集合)中定义局域变量,仅在此语句块中起作用,对其的改变不对块外同名变量造成影响。 千万不要在循环中使用,否则每次循环都定义一个新的局域变量! 例子 结果输出 函数名times 调用语法timelist = times 解说返回该程序及所有子进程消耗的工作时间。 返回值为四个浮点数的列表: 1、程序耗用的用户时间 2、程序耗用的系统时间 3、子进程耗用的用户时间 4、子进程耗用的系统时间 例子 结果输出 二、数学函数 函数名sin 调用语法retval = sin (value); 解说参数为弧度值。 函数名cos 调用语法retval = cos (value); 解说参数为弧度值。 函数名atan2 调用语法retval = atan2 (value1, value2); 解说运算并返回value1除以value2结果的arctan值,单位为弧度,范围在-PI~PI。 应用例: 角度转化成弧度子程序。sub degrees_to_radians { local ($degrees) = @_; local ($radians);11: $radians = atan2(1,1) * $degrees / 45; } 函数名sqrt 调用语法retval = sqrt (value); 解说平方根函数。value为非负数。 函数名exp 调用语法retval = exp (value); 解说返回e的value次方。 函数名log 调用语法retval = log (value); 解说以e为底的自然对数。 函数名abs 调用语法retval = abs (value); 解说绝对值函数。(Perl 4中没有) 函数名rand 调用语法retval = rand (num); 解说随机数函数,返回0和整数num之间的一个浮点数。 函数名srand 调用语法srand (value); 解说初始化随机数生成器。保证每次调用rand真正随机。 三、字符串处理函数 函数名index 调用语法position = index (string, substring, position); 解说返回子串substring在字符串string中的位置,如果不存在则返回-1。参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配。 函数名rindex 调用语法position = rindex (string, substring, position); 解说与index类似,区别是从右端匹配。 函数名length 调用语法num = length (string); 解说返回字符串长度,或者说含有字符的数目。 函数名pos 调用语法offset = pos(string); 解说返回最后一次模式匹配的位置。 函数名substr 调用语法substr (expr, skipchars, length) 解说抽取字符串(或表达式生成的字符串)expr中的子串,跳过skipchars个字符,或者说从位置skipchars开始抽取子串(第一个字符位置为0),子串长度为length,此参数可忽略,意味着取剩下的全部字符。 当此函数出现在等式左边时,expr必须为变量或数组元素,此时其中部分子串被等式右边的值替换。 函数名study 调用语法study (scalar); 解说用一种内部格式提高变量的访问速度,同一时刻只对一个变量起作用。 函数名lc uc 调用语法retval = lc(string); retval = uc(string); 解说将字符串全部转换成小/大写字母。 函数名lcfirst ucfirst 调用语法retval = lcfirst(string); retval = ucfirst(string); 解说将第一个字母转换成小/大写。 函数名quotameta 调用语法newstring = quotemeta(oldstring); 解说将非单词的字母前面加上反斜线(\)。 语句 : $string = quotemeta($string); 等效于:$string =~ s/(\W)/\\$1/g; 常用于模式匹配操作中,确保字符串中没有字符被看作匹配操作符。 函数名join 调用语法join (joinstr, list); 解说把字符串列表(数组)组合成一个长的字符串,在每两个列表元素间插入串joinstr。 函数名sprintf 调用语法sprintf (string, fields); 解说与printf类似,区别是结果不输出到文件,而作为返回值赋给变量。 例子$num = 26; $outstr = sprintf("%d = %x hexadecimal or %o octal\n",$num, $num, $num); print ($outstr); 结果输出26 = 1a hexadecimal or 32 octal 四、标量转换函数 函数名chop 调用语法$lastchar = chop (var); 解说var可为变量或数组,当var为变量时,最后一个字符被删除并赋给$lastchar,当var为数组/列表时,所有元素的最后一个字符被删除,最后一个元素的最后一个字母赋给$lastchar。 函数名chomp 调用语法result = chomp(var); 解说检查字符串或字符串列表中元素的最后一个字符是否为由系统变量$/定义的行分隔符,如果是就删除。返回值为实际删除的字符个数。 函数名crypt 调用语法result = crypt (original, salt); 解说用DES算法加密字符串,original是将要加密的字符串,salt是两个字符的字符串,定义如何改变DES算法,以使更难解码。返回值为加密后的串。 函数名hex 调用语法decnum = hex (hexnum); 解说将十六进制数(字符串形式)转化为十进制数。 函数名int 调用语法intnum = int (floatnum); 解说将浮点数舍去小数部分转化为整型数。 函数名oct 调用语法decnum = oct (octnum); 解说将八进制数(字符串形式)或十六进制数("0x.."形式)转化为十进制数。 函数名ord 调用语法asciival = ord (char); 解说返回单个字符的ASCII值,与PASCAL中同名函数类似。 函数名chr 调用语法$char = chr (asciival); 解说返回ASCII值的相应字符,与PASCAL中同名函数类似。 函数名pack 调用语法formatstr = pack(packformat, list); 解说把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。 除了格式a、A和@外,重复使用一种格式多次可在其后加个整数,如: $twoints = pack ("i2", 103, 241); 把同一格式应用于所有的元素则加个*号,如: $manyints = pack ("i*", 14, 26, 11, 83); 对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下: $strings = pack ("a6" x 2, "test1", "test2"); 格式@的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如: $output = pack ("a @6 a", "test", "test2"); pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创建这样的数据可以这样做: $Cstring = pack ("ax", $mystring); 下表是一些格式字符与C中数据类型的等价关系: 字符 等价C数据类型 Cchar ddouble ffloat iint Iunsigned int (or unsigned) llong Lunsigned long sshort Sunsigned short 完整的格式字符见下表。 格式字符 描述 a用空字符(null)补足的字符串 A用空格补足的字符串 b位串,低位在前 B位串,高位在前 c带符号字符(通常-128~127) C无符号字符(通常8位) d双精度浮点数 f单精度浮点数 h十六进制数串,低位在前 H十六进制数串,高位在前 i带符号整数 I无符号整数 l带符号长整数 L无符号长整数 n网络序短整数 N网络序长整数 p字符串指针 s带符号短整数 S无符号短整数 u转化成uuencode格式 vVAX序短整数 VVAX序长整数 x一个空字节 X回退一个字节 @以空字节(null)填充 函数名unpack 调用语法@list = unpack (packformat, formatstr); 解说unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;x为跳过一个字节;@为跳过一些字节到指定的位置,如@4为跳过4个字节。下面看一个@和X合同的例子:$longrightint = unpack ("@* X4 L", $packstring); 此语句将最后四个字节看作无符号长整数进行转化。下面看一个对uuencode文件解码的例子: 1 : #!/usr/local/bin/perl 2 : 3 : open (CODEDFILE, "/u/janedoe/codefile") || 4 : die ("Can't open input file"); 5 : open (OUTFILE, ">outfile") || 6 : die ("Can't open output file"); 7 : while ($line = 8 : $decoded = unpack("u", $line); 9 : print OUTFILE ($decoded); 10: } 11: close (OUTFILE); 12: close (CODEDFILE); 当将pack和unpack用于uuencode时,要记住,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出(详见UNIX中uuencode帮助)。 函数名vec 调用语法retval = vec (vector, index, bits); 解说顾名思义,vec即矢量(vector)函数,它把简单变量vector的值看作多块(维)数据,每块含一定数目的位,合起来即一个矢量数据。每次的调用访问其中一块数据,可以读取,也可以写入。参数index就象数组下标一样,提出访问哪一块,0为第一块,依次类推,要注意的是访问次序是从右到左的,即第一块在最右边。参数bits指定每块中的位数,可以为1,2,4,8,16或32。 例子1 : #!/usr/local/bin/perl 2 : 3 : $vector = pack ("B*", "11010011"); 4 : $val1 = vec ($vector, 0, 4); 5 : $val2 = vec ($vector, 1, 4); 6 : print ("high-to-low order values: $val1 and $val2\n"); 7 : $vector = pack ("b*", "11010011"); 8 : $val1 = vec ($vector, 0, 4); 9 : $val2 = vec ($vector, 1, 4); 10: print ("low-to-high order values: $val1 and $val2\n"); 结果high-to-low order values: 3 and 13 low-to-high order values: 11 and 12 函数名defined 调用语法retval = defined (expr); 解说判断一个变量、数组或数组的一个元素是否已经被赋值。expr为变量名、数组名或一个数组元素。 如果已定义,返回真,否则返回假。 函数名undef 调用语法retval = undef (expr); 解说取消变量、数组或数组元素甚至子程序的定义,回收其空间。返回值始终为未定义值,此值与空串等效。 五、数组和列表函数 函数名grep 调用语法@foundlist = grep (pattern, @searchlist); 解说与同名的UNIX查找工具类似,grep函数在列表中抽取与指定模式匹配的元素,参数pattern为欲查找的模式,返回值是匹配元素的列表。 例子@list = ("This", "is", "a", "test"); @foundlist = grep(/^[tT]/, @list); 结果@foundlist = ("This", "test"); 函数名splice 调用语法@retval = splice (@array, slipelements, length, @newlist); 解说拼接函数可以向列表(数组)中间插入元素、删除子列表或替换子列表。参数skipelements是拼接前跳过的元素数目,length是被替换的元素数,newlist是将要拼接进来的列表。当newlist的长度大于length时,后面的元素自动后移,反之则向前缩进。因此,当length=0时,就相当于向列表中插入元素,而形如语句 splice (@array, -1, 0, "Hello"); 则向数组末尾添加元素。而当newlist为空时就相当于删除子列表,这时,如果length为空,就从第skipelements个元素后全部删除,而删除最后一个元素则为:splice (@array, -1);这种情况下,返回值为被删去的元素列表。 函数名shift 调用语法element = shift (@arrayvar); 解说删去数组第一个元素,剩下元素前移,返回被删去的元素。不加参数时,缺省地对@ARGV进行操作。 函数名unshift 调用语法count = unshift (@arrayver, elements); 解说作用与shift相反,在数组arrayvar开头增加一个或多个元素,返回值为结果(列表)的长度。等价于splice (@array, 0, 0, elements); 函数名push 调用语法push (@arrayvar, elements); 解说在数组末尾增加一个或多个元素。等价于slice (@array, @array, 0, elements); 函数名pop 调用语法element = pop (@arrayvar); 解说与push作用相反,删去列表最后一个元素,并将其作为返回值,当列表已空,则返回“未定义值”(即空串)。 函数名split 调用语法@list = split (pattern, string, maxlength); 解说将字符串分割成一组元素的列表。每匹配一次pattern,就开始一个新元素,但pattern本身不包含在元素中。maxlength是可选项,当指定它时,达到该长度就不再分割。 函数名sort 调用语法@sorted = sort (@list); 解说按字母次序给列表排序。 函数名reverse 调用语法@reversed = reverse (@list); 解说按字母反序给列表排序。 函数名map 调用语法@resultlist = map (expr, @list); 解说此函数在Perl5中定义,可以把列表中的各个元素作为表达式expr的操作数进行运算,其本身不改变,结果作为返回值。在表达式expr中,系统变量$_代表各个元素。 例子1、@list = (100, 200, 300); @results = map ($_+1, @list); 2、@results = map (&mysub($_), @list); 结果1、(101, 201, 301) 2、无 函数名wantarray 调用语法result = wantarray(); 解说Perl中,一些内置函数的行为根据其处理简单变量还是数组有所不同,如chop。自定义的子程序也可以定义这样两种行为。当子程序被期望返回列表时,此函数返回值为非零值(真),否则为零值(假)。 例子1 : #!/usr/local/bin/perl 2 : 3 : @array = &mysub(); 4 : $scalar = &mysub(); 5 : 6 : sub mysub { 7 : if (wantarray()) { 8 : print ("true\n"); 9 : } else { 10: print ("false\n"); 11: } 12: } 结果$program true false $ 六、关联数组函数 函数名keys 调用语法@list = keys (%assoc_array); 解说返回关联数组无序的下标列表。 函数名values 调用语法@list = values (%assoc_array); 解说返回关联数组无序的值列表。 函数名each 调用语法@pair = each (%assoc_array); 解说返回两个元素的列表--键值对(即下标和相应的值),同样无序。当关联数组已空,则返回空列表。 函数名delete 调用语法element = delete (assoc_array_item); 解说删除关联数组中的元素,并将其值作为返回值。 例子%array = ("foo", 26, "bar", 17"); $retval = delete ($array); 结果$retval = 26; 函数名exists 调用语法result = exists (element); 解说在Perl5中定义,判断关联数组中是否存在某元素,若存在,返回非零值(真),否则返回零值(假)。 例子$result = exists ($myarray); |

9楼2005-06-14 19:25:18
miRNA
至尊木虫 (职业作家)
水王之王(愚愚学园管理员)
- 应助: 0 (幼儿园)
- 贵宾: 16.6
- 金币: 13289.9
- 红花: 4
- 帖子: 4967
- 在线: 10.3小时
- 虫号: 56231
- 注册: 2005-01-07
- 专业: 金属有机化学
★
yuefour(金币+1):辛苦了
yuefour(金币+1):辛苦了
|
第三章 操作符 一、算术操作符 :+(加)、-(减)、*(乘)、/(除)、**(乘幂)、%(取余)、-(单目负) (1)乘幂的基数不能为负,如 (-5) ** 2.5 # error; (2)乘幂结果不能超出计算机表示的限制,如10 ** 999999 # error (3)取余的操作数如不是整数,四舍五入成整数后运算;运算符右侧不能为零 (4)单目负可用于变量: - $y ; # 等效于 $y * -1 二、整数比较操作符 Table 3.1. 整数比较操作符 操作符描述 <小于 >大于 ==等于 <=小于等于 >=大于等于 !=不等于 <=>比较,返回 1, 0, or -1 操作符<=>结果为: 0 - 两个值相等 1 - 第一个值大 1 - 第二个值大 三、字符串比较操作符 Table 3.2. 字符串比较操作符 操作符描述 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. 赋值操作符例子 表达式等效表达式 $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, -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 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, 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 = 2 、字符串中的方括号和变量替换 "$var[0]" 为数组@var的第一个元素。 "$var\[0]" 将字符"["转义,等价于"$var". "[0]",$var被变量替换,[0]保持不变。 "$[0]" 亦等价于"$var" ."[0]"。 "$\"则取消了大括号的变量替换功能,包含文字:$. 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 ("@array\n" ; 结果为: 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 (未完) |

2楼2005-06-14 19:15:41
miRNA
至尊木虫 (职业作家)
水王之王(愚愚学园管理员)
- 应助: 0 (幼儿园)
- 贵宾: 16.6
- 金币: 13289.9
- 红花: 4
- 帖子: 4967
- 在线: 10.3小时
- 虫号: 56231
- 注册: 2005-01-07
- 专业: 金属有机化学
|
第五章 文件读写 一、打开、关闭文件 语法为open (filevar, filename),其中filevar为文件句柄,或者说是程序中用来代表某文件的代号,filename为文件名,其路径可为相对路径,亦可为绝对路径。 open(FILE1,"file1"); open(FILE1, "/u/jqpublic/file1"); 打开文件时必须决定访问模式,在PERL中有三种访问模式:读、写和添加。后两种模式的区别在于写模式将原文件覆盖,原有内容丢失,形式为:open(outfile,">outfile");而添加模式则在原文件的末尾处继续添加内容,形式为:open(appendfile, ">>appendfile")。要注意的是,不能对文件同时进行读和写/添加操作。 open的返回值用来确定打开文件的操作是否成功,当其成功时返回非零值,失败时返回零,因此可以如下判断: if (open(MYFILE, "myfile")) { # here's what to do if the file opened successfully } 当文件打开失败时结束程序: unless (open (MYFILE, "file1")) { die ("cannot open input file file1\n"); } 亦可用逻辑或操作符表示如下: open (MYFILE, "file1") || die ("Could not open file"); 当文件操作完毕后,用close(MYFILE); 关闭文件。 二、读文件 语句$line = 语句@array = 三、写文件 形式为: open(OUTFILE, ">outfile"); print OUTFILE ("Here is an output line.\n"); 注:STDOUT、STDERR为标准输出和标准错误文件,通常为屏幕,且不需要打开。 四、判断文件状态 1、文件测试操作符 语法为:-op expr,如: if (-e "/path/file1") { print STDERR ("File file1 exists.\n"); } 文件测试操作符 操作符描述 -b是否为块设备 -c 是否为字符设备 -d 是否为目录 -e 是否存在 -f 是否为普通文件 -g 是否设置了setgid位 -k 是否设置了sticky位 -l 是否为符号链接 -o 是否拥有该文件 -p 是否为管道 -r 是否可读 -s 是否非空 -t 是否表示终端 -u 是否设置了setuid位 -w 是否可写 -x 是否可执行 -z 是否为空文件 -A 距上次访问多长时间 -B 是否为二进制文件 -C 距上次访问文件的inode多长时间 -M 距上次修改多长时间 -O 是否只为“真正的用户”所拥有 -R 是否只有“真正的用户”可读 -S 是否为socket -T 是否为文本文件 -W 是否只有"真正的用户"可写 -X 是否只有"真正的用户"可执行 注:“真正的用户”指登录时指定的userid,与当前进程用户ID相对,命令suid可以改变有效用户ID。 例: unless (open(INFILE, "infile")) { die ("Input file infile cannot be opened.\n"); } if (-e "outfile") { die ("Output file outfile already exists.\n"); } unless (open(OUTFILE, ">outfile")) { die ("Output file outfile cannot be opened.\n"); } 等价于 open(INFILE, "infile") && !(-e "outfile") && open(OUTFILE, ">outfile") || die("Cannot open files\n"); 五、命令行参数 象C一样,PERL也有存储命令行参数的数组@ARGV,可以用来分别处理各个命令行参数;与C不同的是,$ARGV[0]是第一个参数,而不是程序名本身。 $var = $ARGV[0]; # 第一个参数 $numargs = @ARGV; # 参数的个数 PERL中,<>操作符实际上是对数组@ARGV的隐含的引用,其工作原理为: 1、当PERL解释器第一次看到<>时,打开以$ARGV[0]为文件名的文件; 2、执行动作shift(@ARGV); 即把数组@ARGV的元素向前移动一个,其元素数量即减少了一个。 3、<>操作符读取在第一步打开的文件中的所有行。 4、读完后,解释器回到第一步重复。 例: @ARGV = ("myfile1", "myfile2"); #实际上由命令行参数赋值 while ($line = <>) { print ($line); } 将把文件myfile1和myfile2的内容打印出来。 六、打开管道 用程序的形式也可以象命令行一样打开和使用管道(ex:ls > tempfile)。如语句open (MYPIPE, "| cat >hello"); 打开一个管道,发送到MYPIPE的输出成为命令"cat >hello"的输入。由于cat命令将显示输入文件的内容,故该语句等价于open(MYPIPE, ">hello"); 用管道发送邮件如下: open (MESSAGE, "| mail dave"); print MESSAGE ("Hi, Dave! Your Perl program sent this!\n"); close (MESSAGE); 第六章 模式匹配 一、简介 模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def。其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line); 二、匹配操作符 =~、!~ =~检验匹配是否成功:$result = $var =~ /abc/;若在该字符串中找到了该模式,则返回非零值,即true,不匹配则返回0,即false。!~则相反。 这两个操作符适于条件控制中,如: if ($question =~ /please/) { print ("Thank you for being polite!\n"); } else { print ("That was not very polite!\n"); } 三、模式中的特殊字符 PERL在模式中支持一些特殊字符,可以起到一些特殊的作用。 1、字符 + +意味着一个或多个相同的字符,如:/de+f/指def、deef、deeeeef等。它尽量匹配尽可能多的相同字符,如/ab+/在字符串abbc中匹配的将是abb,而不是ab。 当一行中各单词间的空格多于一个时,可以如下分割: @array = split (/ +/, $line); 注:split函数每次遇到分割模式,总是开始一个新单词,因此若$line以空格打头,则@array的第一个元素即为空元素。但其可以区分是否真有单词,如若$line中只有空格,则@array则为空数组。且上例中TAB字符被当作一个单词。注意修正。 2、字符 []和[^] []意味着匹配一组字符中的一个,如/a[0123456789]c/将匹配a加数字加c的字符串。与+联合使用例:/d[eE]+f/匹配def、dEf、deef、dEdf、dEEEeeeEef等。^表示除其之外的所有字符,如:/d[^deE]f/匹配d加非e字符加f的字符串。 3、字符 *和? 它们与+类似,区别在于*匹配0个、1个或多个相同字符,?匹配0个或1个该字符。如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。 4、转义字符 如果你想在模式中包含通常被看作特殊意义的字符,须在其前加斜线"\"。如:/\*+/中\*即表示字符*,而不是上面提到的一个或多个字符的含义。斜线的表示为/\\/。在PERL5中可用字符对\Q和\E来转义。 5、匹配任意字母或数字 上面提到模式/a[0123456789]c/匹配字母a加任意数字加c的字符串,另一种表示方法为:/a[0-9]c/,类似的,[a-z]表示任意小写字母,[A-Z]表示任意大写字母。任意大小写字母、数字的表示方法为:/[0-9a-zA-Z]/。 6、锚模式 锚描述 ^ 或 \A仅匹配串首 $ 或 \Z仅匹配串尾 \b匹配单词边界 \B单词内部匹配 例1:/^def/只匹配以def打头的字符串,/$def/只匹配以def结尾的字符串,结合起来的/^def$/只匹配字符串def(?)。\A和\Z在多行匹配时与^和$不同。 例2:检验变量名的类型: if ($varname =~ /^\$[A-Za-z][_0-9a-zA-Z]*$/) { print ("$varname is a legal scalar variable\n"); } elsif ($varname =~ /^@[A-Za-z][_0-9a-zA-Z]*$/) { print ("$varname is a legal array variable\n"); } elsif ($varname =~ /^[A-Za-z][_0-9a-zA-Z]*$/) { print ("$varname is a legal file variable\n"); } else { print ("I don't understand what $varname is.\n"); } 例3:\b在单词边界匹配:/\bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef。/def\b/匹配def和abcdef等以def结尾的单词,但不匹配defghi,/\bdef\b/只匹配字符串def。注意:/\bdef/可匹配$defghi,因为$并不被看作是单词的部分。 例4:\B在单词内部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。 7、模式中的变量替换 将句子分成单词: $pattern = "[\\t ]+"; @words = split(/$pattern/, $line); 8、字符范围转义 E 转义字符描述范围 \d任意数字[0-9] \D除数字外的任意字符 [^0-9] \w任意单词字符[_0-9a-zA-Z] \W任意非单词字符[^_0-9a-zA-Z] \s空白[ \r\t\n\f] \S非空白[^ \r\t\n\f] 例:/[\da-z]/匹配任意数字或小写字母。 9、匹配任意字符 字符"."匹配除换行外的所有字符,通常与*合用。 10、匹配指定数目的字符 字符对{}指定所匹配字符的出现次数。如:/def/匹配def,deef和deeef;/def/匹配deeef;/def/匹配不少于3个e在d和f之间;/def/匹配不多于3个e在d和f之间。 11、指定选项 字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。 例:检验数字表示合法性 if ($number =~ /^-?\d+$|^-?0[xX][\da-fa-F]+$/) { print ("$number is a legal integer.\n"); } else { print ("$number is not a legal integer.\n"); } 其中 ^-?\d+$ 匹配十进制数字,^-?0[xX][\da-fa-F]+$ 匹配十六进制数字。 12、模式的部分重用 当模式中匹配相同的部分出现多次时,可用括号括起来,用\n来多次引用,以简化表达式: /\d([\W])\d\1\d/ 匹配: 12-05-92 26.11.87 07 04 92等 注意:/\d([\W])\d\1\d/ 不同于/(\d)([\W])\1\2\1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。 13、转义和特定字符的执行次序 象操作符一样,转义和特定字符也有执行次序: 特殊字符描述 ()模式内存 + * ? {}出现次数 ^ $ \b \B锚 |选项 14、指定模式定界符 缺省的,模式定界符为反斜线/,但其可用字母m自行指定,如: m!/u/jqpublic/perl/prog1! 等价于/\/u\/jqpublic\/perl\/prog1/ 注:当用字母'作为定界符时,不做变量替换;当用特殊字符作为定界符时,其转义功能或特殊功能即不能使用。 15、模式次序变量 在模式匹配后调用重用部分的结果可用变量$n,全部的结果用变量$Content$amp;。 $string = "This string contains the number 25.11."; $string =~ /-?(\d+)\.?(\d+)/; # 匹配结果为25.11 $integerpart = $1; # now $integerpart = 25 $decimalpart = $2; # now $decimalpart = 11 $totalpart = $Content$amp;; # now totalpart = 25.11 四、模式匹配选项 选项描述 g匹配所有可能的模式 i忽略大小写 m将串视为多行 o只赋值一次 s将串视为单行 x忽略模式中的空白 1、匹配所有可能的模式(g选项) @matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta") 匹配的循环: while ("balata" =~ /.a/g) { $match = $Content$amp;; print ("$match\n"); } 结果为: ba la ta 当使用了选项g时,可用函数pos来控制下次匹配的偏移: $offset = pos($string); pos($string) = $newoffset; 2、忽略大小写(i选项)例 /de/i 匹配de,dE,De和DE。 3、将字符串看作多行(m选项) 在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。 4、只执行一次变量替换例 $var = 1; $line = while ($var < 10) { $result = $line =~ /$var/o; $line = $var++; } 每次均匹配/1/。 5、将字符串看作单行例 /a.*bc/s匹配字符串axxxxx \nxxxxbc,但/a.*bc/则不匹配该字符串。 6、在模式中忽略空格 /\d ([\W]) \d \1 \d/x等价于/\d([\W])\d\1\d/。 五、替换操作符 语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement。如: $string = "abc123def"; $string =~ s/123/456/; # now $string = "abc456def"; 在替换部分可使用模式次序变量$n,如s/(\d+)/[$1]/,但在替换部分不支持模式的特殊字符,如{},*,+等,如s/abc/[def]/将把abc替换为[def]。 替换操作符的选项如下表: 选项描述 g改变模式中的所有匹配 i忽略模式中的大小写 e替换字符串作为表达式 m将待匹配串视为多行 o仅赋值一次 s将待匹配串视为单行 x忽略模式中的空白 注:e选项把替换部分的字符串看作表达式,在替换之前先计算其值,如: $string = "0abc1"; $string =~ s/[a-zA-Z]+/$Content$amp; x 2/e; # now $string = "0abcabc1" 六、翻译操作符 这是另一种替换方式,语法如:tr/string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如: $string = "abcdefghicba"; $string =~ tr/abc/def/; # now string = "defdefghifed" 当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。 翻译操作符的选项如下: 选项描述 c翻译所有未指定字符 d删除所有指定字符 s把多个相同的输出字符缩成一个 如$string =~ tr/\d/ /c;把所有非数字字符替换为空格。$string =~ tr/\t //d;删除tab和空格;$string =~ tr/0-9/ /cs;把数字间的其它字符替换为一个空格。 七、扩展模式匹配 PERL支持PERL4和标准UNIX模式匹配操作所没有的一些模式匹配能力。其语法为:(? 1、不存贮括号内的匹配内容 在PERL的模式中,括号内的子模式将存贮在内存中,此功能即取消存贮该括号内的匹配内容,如/(?:a|b|c)(d|e)f\1/中的\1表示已匹配的d或e,而不是a或b或c。 2、内嵌模式选项 通常模式选项置于其后,有四个选项:i、m、s、x可以内嵌使用,语法为:/(?option)pattern/,等价于/pattern/option。 3、肯定的和否定的预见匹配 肯定的预见匹配语法为/pattern(?=string)/,其意义为匹配后面为string的模式,相反的,(?!string)意义为匹配后面非string的模式,如: $string = "25abc8"; $string =~ /abc(?=[0-9])/; $matched = $Content$amp;; # $Content$amp;为已匹配的模式,此处为abc,而不是abc8 4、模式注释 PERL5中可以在模式中用?#来加注释,如: if ($string =~ /(?i)[a-z](?# match two or three alphabetic characters)/ { ... } |

3楼2005-06-14 19:16:56
miRNA
至尊木虫 (职业作家)
水王之王(愚愚学园管理员)
- 应助: 0 (幼儿园)
- 贵宾: 16.6
- 金币: 13289.9
- 红花: 4
- 帖子: 4967
- 在线: 10.3小时
- 虫号: 56231
- 注册: 2005-01-07
- 专业: 金属有机化学
|
第七章 控制结构 一、条件判断 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 = 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); 虽然条件判断写在后面,但却是先执行的 第八章 子程序 一、定义 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读。PERL中,子程序可以出现在程序的任何地方。定义方法为: sub subroutine{ statements; } 二、调用 调用方法如下: 1、用&调用 &subname; ... sub subname{ ... } 2、先定义后调用 ,可以省略&符号 sub subname{ ... } ... subname; 3、前向引用 ,先定义子程序名,后面再定义子程序体 sub subname; ... subname; ... sub subname{ ... } 4、用do调用 do my_sub(1, 2, 3);等价于&my_sub(1, 2, 3); 三、返回值 缺省的,子程序中最后一个语句的值将用作返回值。语句return (retval);也可以推出子程序并返回值retval,retval可以为列表。 四、局部变量 子程序中局部变量的定义有两种方法:my和local。其区别是:my定义的变量只在该子程序中存在;而local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中(在PERL4中没有my)。定义时可以给其赋值,如: my($scalar) = 43; local(@array) = (1, 2, 3); 五、子程序参数传递 1、形式 &sub1(&number1, $number2, $nubmer3); ... sub sub1{ my($number1, $number2, $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, 2, 3, 4, 5); &my_sub(*myarray); sub my_sub { my (*subarray) = @_; } 2、此方法类似于C语言中的传递数组的起始地址指针,但并不一样,在定义数组的别名之后,如果有同名的简单变量,则对该变量也是起作用的。如: $foo = 26; @foo = ("here's", "a", "list" ; &testsub (*foo); ... sub testsub { local (*printarray) = @_; ... $printarray = 61; } 当子程序执行完,主程序中的$foo的值已经成了61,而不再是26了。 3、用别名的方法可以传递多个数组,如: @array1 = (1, 2, 3); @array2 = (4, 5, 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 found\n" ; # 变量$AUTOLOAD即未找到的子程序名 print("arguments passed: @_\n" ; } 若同一个预定义子程序定义了多个,则BEGIN顺序执行,END逆序执行。 |

4楼2005-06-14 19:17:17













;
回复此楼