2007年4月30日星期一

《Learning Perl》学习笔记 -- 第六章 I/O基础

本章主要讲述了如何从标准输入/文件中获得输入及如何向标准输出进行输出。

1.从标准输入进行输入

使用行输入操作符<STDIN>从标准输入中获得输入。

$line = <STDIN>; # 读入一行

在循环中使用:

while (<STDIN>) {
...
}


foreach (<STDIN>) {
...
}

使用这种写法,行输入的数据被存储在默认的标量变量$_中,当然也可以显式的将行输入数据赋给一个已定义的标量变量中,如$line。
上述两个循环的区别是:
while循环每次处理一行数据,而foreach循环会首先读入全部输入,然后在逐行处理。所以,如果输入的文件很大,最好使用while循环。

2.从钻石操作符(<>)进行输入

钻石操作符被设计用来处理命令行参数(或者称为“调用参数”),可以看作是特殊的行输入操作符。

例如:

./my_program fred barney betty

my_program是命令,后面的fred、barney和betty是这个命令的命令行参数,可能是三个文件的名字(若从标准输入进行输入,则用-表示)。钻石操作符的作用是从命令行参数中连续获得输入数据,好像将这三个文件合并成一个大的文件后,逐行输入似的。如下所示:

while (<>) {

chomp;

print "It was $_ that I saw!n";

}

这个循环的会依次从fred、barney和betty这三个文件中读取输入,然后逐个打印出来。

3.调用参数

命令的调用参数实际存储在Perl预设的数组@ARGV中,钻石操作符从@ARGV数组中获得命令行参数信息。譬如上面的例子中(./my_program fred barney betty),@ARGV数组中的元素为:$ARGV[0] = fred, $ARGV[1] = barney, $ARGV[2] = betty。程序自己的名字被存储在Perl的特殊变量$0中。

可以在程序开始后和使用钻石操作符前调整@ARGV,从而改变处理的参数(可能不是命令行参数了)。例如,下面我们可以处理三个指定的文件,不论用户在命令行中输入了什么参数:

@ARGV = qw /larry moe curly/; # 强制读取这三个文件

while (<>) {

...

}

4.向标准输出进行输出

使用print函数向标注输出进行无格式的输出,如:print "Hello, I'm here!n";

使用printf函数向标准输出进行格式化的输出,格式化操作和C语言类似,如:printf "Hello, %s. Your password expires in %d days! n", $user, $days_to_die;

格式字符串含有几个所谓的转换,每个转换以一个百分号(%)开始,以一个字母结束;在后面列表中的条目数目应该与转换的个数相同,如果它们不匹配,就很难正确工作。

%g:g表示General,要按一般较合适的方式打印一个数字,可以使用%g,它会根据需要自动选择浮点、整数,甚至是指数表示;

%d:表示十进制整数,会根据需要对数据进行截取(注意,不是舍入);类似的,%x表示十六进制,%o表示八进制;在d前面加上整数,可以表示需要打印的字段宽度,若整数为负数,则表示左对齐;

%s:表示一个字符串,它按字符串进行给定值的替换,但有一个给定的字段宽,譬如,printf "%10sn", "wilma";

%f:表示浮点数,它会根据需要进行舍入,可以指定小数点后的位数,譬如,printf "%12.3fn", 6*7 + 2/3;

%%:打印一个真正的百分号,它的特殊之处在于它不需要列表中的元素与之对应。

没有评论: