perl第4章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章输入输出与文件目录刘融华中农业大学生物信息中心STDIN为行输入操作,实际上对每一个文件句柄的行输入操作均有表示chomp($line=STDIN);chomp(@line=STDIN);行输入操作到达文件的结尾时将返回undef,表示文件结束while(defined($line=STDIN)){printIsaw$line;}如果此处省略$line,则值被读取到$_中。while(STDIN){printTheinputcharacteris:$_;}读取标准输入钻石操作符使用可以从指定的地方(通常是文件)读取输入。程序运行时,需要指定参数。myProgram包含以下代码:while(defined($line=)){chomp($line);printItwas$linethatIsaw!\n;}命令行参数:perlmyProgram文件1文件2……文件n注意:I.Perl会把这些文件串联起来一并输出,中间没有间隔。II.如果没有命令行参数,会默认从STDIN读取输入。调用参数前面的命令行参数并不是直接传给,Perl会把这些参数放到默认的特殊数组@ARGV里,从这个数组里面读取参数。@ARGV本质上就是一个数组,数组的所有操作对它全部适用。如果@ARGV为空,则仍然默认从标准输入流读取数据。如果我们给@ARGV赋值,则程序始终只读取指定的文件,命令行参数不再起作用。@ARGV=qw/larrymorcurly/;while(){chomp;print“Itwas$_thatIsaw!\n”;}print输出打印数组和内插一个数组是不同的:@array=qw/fredbarneybetty/;print@array;print“@array”;print实际上是一个函数,它的返回值通常为1,表示打印成功,调用的时候一般不加括号。print(“Hello,world!\n”);pirnt“Hello,world!\n”;print(1+2)*4;printf输出格式Perl中的printf类似于C中的printf,可以按指定格式输出结果。它的格式:printf“格式1格式2……格式n”,数据1,数据2,……数据n;printf“%f%f%d\n”,5/2,51/17,51**17;注意:输出数据列表各个元素间需要用逗号隔开。常用格式:%d:十进制整数%s:字符串%f:浮点数%g:代表任何数值形式,Perl会自动判断恰当的输出数值形式。格式字符串之间可以插入任意字符。$user=paul;$date=30;printfhello,%s,yourpwdexpiresin%ddays.,$user,$date;%d会将数值自动转换成整数,即使输出列表是浮点数或其他。printfyourpwdexpiresin%ddays,17.50;%g自动选择输出的数值形式。printf%g%g%g,3.5,4,string;格式参数索引printf'%2$d%1$d',12,34;#输出3412printf'%3$d%d%1$d',1,2,3;#输出311输出正数printf'%+d',12;#输出+12,不适用于负数输出其它进制格式,符号#表示前端加0printf'%#o',12;#prints014printf'%#x',12;#prints0xcprintf'%#X',12;#prints0XCprintf'%#b',12;#prints0b1100printf'%#B',12;#prints0B1100指定输出宽度类似于C语言:printf%6d,42;#右对齐,输出____42printf%2d,2001;#自动扩展输出2001printf%-6d,42;#左对齐,输出42____printf%10.3f,42.3333333;#输出____42.333,此处小数点占一位。10.3表示输出数值长度为10,其中小数点后保留三位。如果数值超出指定宽度,按四舍五入计算。注意:如果要输出%,只需在%之前再加上一个%。printf%d%%,42;字符串的精度控制字符串的输出可以通过小数点后的参数来控制,参数为负数将被忽视sprintf函数的参数和printf的参数完全相同,但它返回的是被请求的字符串,而非打印出来。这对于希望将某个格式的字符串存入变量以供将来使用的情况非常方便。$result=sprintf(%8d,$number);$rounded=sprintf(%.3f,$number);$localtime=sprintf“%4d/%02d/%02d%02d:%02d:%02d”,$yr,$mo,$da,$h,$m,$s;#得到像“2038/01/19/03:00:08”这样的值。格式中前置的0代表:如果输出字符未占满指定宽度,在前面补0,使之达到需要的宽度。Perl语言中sprintf格式化输出数组不采用循环的打印方式:@a=qw/you0.7meher/;$f=theitemsare:\n.%10s\nx@a;printf$f,@a;printftheitemsare:\n.%10s\nx@a,@a;文件句柄文件句柄是Perl进程与外界之间(I/O)联系的媒介命名规则与变量相同,建议使用大写字母命名Perl保留的句柄包括STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT,请勿用于命名创建自己的文件句柄格式:open文件句柄,文件名;openREAD,“dino”;openREAD,“dino”;#表示打开文件进行读取,通常“”可省略。openWRITE,“dino”;#表示打开文件进行写入,如果已有一个名为dino的文件,则覆盖原内容;如果没有,则创建一个文件。openWRITE“dino”;#以追加的方式打开文件进行写入,如果没有该文件,则创建;如果该文件已存在,则在文件最后面接着写入。可用标量表达式代替文件名字$selected_output=“my_output”;openLOG,“$selected_output”;注意:当$selected_output为“passwd”,则它将变成追加。新版本支持“3参数”格式openCONFIG,“”,“dino”;openBEDROCK,“”,$file_name;openLOG,“”,$logfile_name;对文件进行写入操作时,只要进行指定可以创建任何格式的文件,否则默认创建文本文件。openOUT,”dino.txt”#创建一个文本文档openOUT,”dino”#仍然创建一个文本文档openOUT,”dino.fasta”#创建一个fasta格式的文档openOUT,”dino.doc”#创建一个word文档有问题的文件句柄$success=openLOG,“logifle”;#将返回值保存if(!$success){print“wecan’topenthefile”;#打开失败}die处理严重错误if(!openLOG,“logfile”){die“Cannotcreatelogfile:$!”;}openLOG,“logfile”||die“Cannotcreatelogfile:$!”;#$!为系统产生的可读信息,例如:Cannotcreatelogfile:permissiondeniedatyour_programline1234.关闭文件句柄closeINPUT;closeOUTPUT;使用文件句柄当某个文件句柄被打开进行输入时,可以像从STDIN中输入一样。if(!openPASSWD,“/etc/passwd”){die“Howdidyougetloggedin?($!)”;}while(PASSWD){chomp;…}@array=PASSWD;chomp@array;使用文件句柄输出printLOG“Captain’slog,stardate3.14159\n”;printfOUTPUT“%dpercentcomplete.\n”,$done/$total*100;openOPEN,”file1.txt”;selectOPEN;#select用于指定文件句柄print$i;#$i会被输入到file1中复制文件示例用say来输出use5.010;#不能删除my@array=qw(abcd);say@array;say@array;标量变量中的文件句柄$rocks_fh;open$rocks_fh,‘’,‘rocks.txt’ordie“$!”;while($rocks_fh){chomp;…}判断文件状态文件测试操作语法:-opexprif(-e/path/file1){printTrue\n;}else{printFalse\n;}打开目录格式:opendir目录句柄,目录名;opendir(DIR,'.')ordieCouldn'topendirectory,$!;while($file=readdirDIR){print$file\n;}closedirDIR;另一种获取目录的方式DOS中dir*.txt可用于输出以.txt结尾的所有文件目录列表,UNIX中的globbing可以完成类似的功能,Perl中则用glob函数完成此功能,格式为globpattern更改目录chdir函数能够更改当前的工作目录,格式为chdirEXPRchdir函数改变当前进程的工作目录到EXPR。如果省略EXPR,即返回调用者的根目录。如果调用成功,该函数将返回1,否则就返回0。系统错误代码将保存在Perl的$!变量中。假设根目录/home/rong:#!/usr/bin/perlchdir/usr/bin/local;#Nowyouarein/usr/bin/localdir.chdir;#Nowyouareinhomedirectory/home/rong创建和删除目录创建目录格式:mkdirnewdir,permissions删除目录格式:rmdirpathnamemkdir中国,0777;mkdir中国/河南省,0777;mkdir中国/河南省/南阳市,0777;#逐级生成文件夹rmdir中国/河南省/南阳市;rmdir中国/河南省;rmdir中国;#逐级删除文件夹注意:I.mkdir函数不能在父文件夹不存在的情况下直接建立子文件夹(Win下不可以,但在Unix下可以),所以要逐级建立文件。II.rmdir只能用于删除空文件夹、只能删除最低级的子文件夹,而不能直接删除包含子文件夹的父文件夹。删除文件在perl中可以用unlink操作符删除文件,同shell的rm命令一样。unlinkaa,bb,cc;与glob函数结合起来可以一次删除多个文件。unlinkglob*.o;unlink的返回值告诉有多少文件被成功删除。$successful=unlinkaa,bb,cc;printIdelete$successfulfilesjustnow.\n;文件重命名格式:rename旧文件名新文件名foreach$file(glob*.old){$newfile=$file;$newfile=~s/\.old$/.new/;if(-e$newfile){warncan'trename$fileto$newfile:$newfileexists.\n;}else{rename$file,$newfile;}

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功