SOURCE HTML: http://socvista.com/bbs/redirect.php?fid=71&tid=909&goto=nextnewset
14:24
-- 从标准输入<STDIN>获得input
<STDIN>是连接一个标准输入块的行输入符,有两种使用方法:
1. while (<STDIN>) {}
2. foreach (<STDIN>) {}
区别是,while是实时执行,而foreach要等到所有输入都被读取后才开始执行。每次循环都对输入块中的一个行进行处理。
-- 从diamond符号中获取文件输入
使用方法:
while (<>) {chomp; print "It was $_ that I saw!\n";}
这里的<>是连接一个文件输入块的行输入符,所谓的文件块可以是若干个文件的联合输入,这些文件通过perl脚本的参数来指定。比如:
./my_program fred barney betty
这个脚本在执行时有三个文件参数,因此这三个相关文件将被读取并连接在一起,然后通过<>符合一行一行读入。直到最后一个文件的EOF处,才会返回一个undef值,表示文件结束。
-- <>符合和调用参数@ARGV的关系
<>符号操作其实参考了@ARGV变量,如果执行脚本时输入了参数,则这些参数会进入这个系统变量,我们也可以人为修改这个变量,如果该变量为空,则等效于<STDIN>。看一个实例:
@ARGV = qw/ fred barney/;
while (<>) {chomp; print "It was $_ that I saw!\n";}
-- 打印文件块
print <>; # source code for 'cat'
print sort <>; # source code for 'sort'
21:02 (File handles)
-- 如何在命令行中指定文件
$ ./you_program <input_filename >output_filename
$ cat fred barney | sort | ./your_program | grep something | lpr # 支持pipeline
$ netstat | ./you_program 2>/tmp/my_errors # 报错
-- 打开file handle
open CONFIG, "dino"; # 打开dino用于输入
open CONFIG, "<dino"; # 打开dino用于输入
open CONFIG, ">dino"; # 打开dino用于输出,new 模式
open CONFIG, ">>dino" # 打开dino用于输出,append模式
文件名可以是变量形式,如
open CONFIG, "> $file_name";
-- 确认打开文件是否失败
my $success = open LOG, ">>logfile";
if (! $success) {}
-- 关闭file handle
close LOG;
-- 定制我们自己的fatal error
通过die来完成。两个功能:使程序退出和输出错误信息。
if (! open LOG, ">>logfile") {
die "Cannot create logfile: $!"; # 此处的$!是open文件失败时系统返回给perl的出错原因。
}
另一个例子。
if (@ARGV <2) {
die "Not enough arguments\n";
}
-- 定制warning
通过warn函数实现。使用方法同die。不同之处是warn不会令程序退出。
-- 使用file handle
一旦file handle成功建立,则使用file handle和使用标准的输入<STDIN>就完全一样了。
if ( ! open PASSWD, "/etc/passwd") {
die "how did you get logged in? ($!)";
}
while (<PASSWD>) {
chomp;
......
}
如果file handle是用于写入或者append的,则可以通过print和printf向文件写内容。
print LOG "captain's log, stardate 3.14\n";
printf LOG ("%d percent complete.\n", $done/$total*100);
注意,print和printf的参数之间没有逗号隔开。
-- 修改输出的file handle
默认的是 STDOUT,但是我们可以修改。
select FH_OUT;
print "welcome!\n";
通过select我们可以选择print的默认输出fiel handle。