输入与输出
标准输入
<STDIN>
为行输入操作符,在标量context中返回标准输入下一行。
while (<STDIN>){
print "I saw $_";
}
note:这个简写只在while循环里中适用,如果把行输入操作符放在其他任何地方,特别是单独成行时,他不会读取一行输入并存到$_
中。
foreach (<STDIN>){
print "I saw $_";
}
如果在列表context中调用行输入操作符,它会返回一个列表,其中包含剩余的所有输入内容,每行内容成为列表的一个元素。
在foreach
中,默认的控制变量是$_
,所以读取的数据放到这里面。
钻石输入符
钻石操作符是行输入操作符的特例。不过它并不是从键盘取得输入,而是从用户指定的位置读取:
while (defined($line = <>)){
chomp($line);
print "It was $line that I saw!\n";
}
perl input.pl fred
输出“It was [从文件fred读取一行]that I saw”直到文件结尾。
while (<>)){
chomp();
print "It was $_ that I saw!\n";
}
使用chomp
而不加参数时,会直接作用在$_
上。
perl v5.22及后续版本,一般用<<>>
。
输出到标准输出
print
会读取它后面参数列表中所有元素,并把每一项依次送到标准输出。
print <>;
相当于cat
命令
print sort <>;
相当于sort
命令
printf格式化输出
my @items = qw( wilma dino pebbles);
my $format = "The items are:\n".("%10s\n" x @items);
printf $format,@items
# 简化为:
printf "the items are:\n".("%10s\n" x @items), @items;
在标量上下文中用了一次@items以取得它的长度,然后又在列表上下文中用了一次以取得它的内同。
文件句柄
打开文件句柄
Larry建议使用全大写字母来命名文件句柄,以避免混淆。
有6个文件句柄是Perl保留的。STDIN, STDOUT, STDERR, DATA, ARGV, ARGVOUT
用户可以在shell里运行一下命令:
./my_program<dino >wilma
这条命令告诉shell,文件的输入应来自文件dino,输出应送到文件wilama
open CONFIG, 'dino';
open CONFIG,'<dino';
open BEDROCK,'>fred';
open LOG, '>>logfile';
第一行打开名为config的文件句柄,让他指向文件dino。它会打开dino文件,文件中的任何内容都能从文件句柄CONFIG被读到我们的程序中来。这和利用shell的重定向将文件经STDIN读入程序的做法类似。第二行和第一行所做的事完全相同。
第三行将可以用来创建一个新的文件:它会打开文件句柄BEDROCK并输出到新文件。如果已经存在该文件,那么久清除原有的内容并以新内容取代之。
第四行,若不存在创建新文件,若存在,新数据会添加在原有文件后面。
关闭文件句柄
close
如close BEDROCK
用die处理致命错误
die
函数可以中止运行并给出错误信息。
if(! open LOG, '>>','logfile'){
die "Cannot create logfile: $!";
}
$!
是perl的特殊变量,保存着最后一刻的系统错误信息。
warn
函数可以发出类似Perl的内置警告信息,区别在于它不会终止程序运行。
Perl v5.10后,autodie
编译指令会在open失败时自动启动die
。
使用文件句柄
if (! open PASSWD, "/etc/passwd"){
die "How did you get logged in? ($!)";
}
while(<PASSWD>){
chomp;
...
}
select
可改变默认的输出文件句柄。
selelct BEDROCK
print "I hope Mr. slate does't find out about this.\n";
print "Wilam!\n";