微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

leanging perl(二) 输入与输出

perl 主要是对文件进行处理,所以免不了需要输入与输出


1.输入

a) 标准输入。 标准输入就是来自键盘的输入了,可以这么用 chomp($line = <STDIN>) 其中,<>接受出入,STDIN表示标准输入,读入标量$line,chomp操作符用来去除输入行末尾的换行符(\n)。也可以这样使用:while (<STDIN>) {

chomp; #认对$_进行处理,等于上一例中的$line

}

b) 从文件输入。 钻石操作符<>,可以接受命令行的文件名,对文件进行按行输入,读取参数来自@ARGV数组,如程序program内容

while (<>) {

chomp;

...

}

则可以在命令行这样输入$ ./program hello world程序会把hello 与 world 文件放入@ARGV数组,然后从数组中依次读取文件,进行处理。如果数组为空,也就是没有参数(即要处理的文件),就会改用标准输入流。


2.输出

a)标准输出 有输入自然要有输出,标准输出就是输出内容到屏幕上。一般使用print 即可。如print "@arr"与print @arr,所不同的是前者会依次打印数组元素,有空格连接,后者没用空格。 如果想像C语言一样有格式化输出,可以使用printf,如printf "I'm %s\n",$name; 模式为‘格式字符串’加上‘要输出的列表’。转换的格式常用的有:%g 自动选择数值形式;%d 十进制整数,%x 十六进制,%o 八进制;%s 字符串;%10.3f 浮点数,四舍五入,表示向右对齐共十位,保留小数点后3位;%-4d,表示向左对齐,共四位。注意要输出%需要用%%。

一个很不错的输出数组的方式printf "The items are:\n".("%10s\n" x @arr),@arr;其中@arr在这里返回数组的元素个数,x表示重复这么多次,即可格式化输出数组全部元素。

b)输出文件 需要先打开文件句柄。


3.文件句柄

在shell中输入命令 $ ./program <file_input> file_output 即表示程序从file_input读取输入,输出到file_output。

a)打开文件句柄。 open HD,"< file_input", open OUT," >file_output",open OUT,">> file_output",分别表示打开文件句柄输入,输出(要么新建文件,要么清空原文件),以添加方式输出。在新版本中当然可以将 '>'  '<'分出来写,更加安全。

b)关闭文件句柄。 close HD,close OUT。


c)出错处理。 不是每次打开文件都会成功

大笑

,这时候可以使用die函数处理,如下:

open HD,"< file_input" or die $!;

如果打开失败会使程序终止运行,并输出$!中内容,包含了失败的原因。 也可以使用warn函数,与die类似,但是不会终止程序运行。


d)使用文件句柄。 了解了上面三点,就可以使用文件句柄工作了

生气

open HD,"< file_input" or die $!; #打开HD,输入file_input内容

open OUT,">> file_output" or die $!; #打开OUT,以追加方式打开file_output

while (<HD>) { #每次读取输入内容的一行

chomp;

my $line .= $_;#将每一行内容连接起来,放入$line

do_something;

}

print OUT "$line\n"; #最后通过句柄OUT将结果输出到file_output。注意OUT与后面内容之间没有逗号。

close HD,OUT;

也可以用say函数来代替print输出,不同之处是末尾认带上换行符\n,很适合懒人啊

吐舌头


有时候会需要将文件一次性读入,然后进行处理。有一个小技巧可以实现。

open FH,"< file_input" or die $!;
local $/ = undef;
my $lines = <FH>;
close FH;

$/ 存储的是每行文件的结束标志,认为“\n”,改为undef之后,相当于每一行都没有结尾,自然可以一次性读入了,然后就可以用$lines进行自由的文本处理了,使用local表示这个改变只适用于本处,不过如果是同一文件,下面接着要进行按行读入,可以这样改回来local $/ = "\n"。这样就可以了。


掌握了这些,相当于掌握了文本处理的框架,接下来就可以进一步的学习perl了。

奋斗

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐