当我运行这个:
open FP, ">xyz"; my $file = *FP; printf $file "first\n"; $file = *STDOUT; printf $file "second\n"; open $file, ">abc"; print $file "third\n"; print STDOUT "fourth\n"; print FP "fifth\n";
"第四"印刷品不是STDOUT,而是"abc".
STDOUT与FP的不同之处在于其表现如预期.
我究竟做错了什么?我不明白的是什么?
嗯,对于初学者来说,你错误地使用'开放'.
open my $fp , '>', 'xyz' ;
是推荐的语法.
强烈建议您使用裸露的'FP',因为它不是词汇.
其次,你将文件指针重新打开为新事物.这不是很好的做法,它应该不是问题,但它只是一个坏主意.你应该关闭文件指针或让它超出范围(通过词法).
第三,'*STDOUT'是一个参考.
my $fh = *STDOUT; print "$fh\n"; #prints '*main::STDOUT';
所以当你这样做时:
open $fh, '>abc';
你在做
open *STDOUT, '>abc';
如果你之后立即做
print "$fh\n";
你会注意到它仍然打印*main::STDOUT
;
一些有趣的代码片段清除了这一点:
my $fh = *STDOUT; open $fh, '<', "foo.txt"; print $fh "hello"; # Filehandle STDOUT opened only for input at (eval 288) line 6. my $fh = *STDIN; open $fh, '<', "foo.txt"; print <>; # contents of foo.txt here
以下是使用open的推荐方法:
sub foo { my $fh; open $fh , '<', 'file.txt' or Carp::croak('Cannot Open File.txt'); # do stuff with $fh; close $fh or Carp::carp('Something annoying in close :S '); }
请注意,如果省略close,则只要$ fh超出可见性,文件就会关闭.
如果我明白你要做什么,我想你想用select
.它允许您轻松切换文件句柄.您还应该使用更现代的open形式(3个参数,词法文件句柄和错误检查).见perldoc perlopentut
.
#!/usr/bin/env perl use strict; use warnings; open my $fh, '>', 'abc' or die "Can't open 'abc': $!"; open my $fh2, '>', 'def' or die "Can't open 'def': $!"; open my $fh3, '>', 'xyz' or die "Can't open 'xyz': $!"; select $fh; print "First\n"; # Later select $fh2; print "Second\n"; # Later select $fh3; print "Third\n"; # Later select STDOUT; print "Fourth\n";