您的位置:首页 > 其它

leanging perl(二) 输入与输出

2014-03-26 14:17 302 查看

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了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  perl