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