作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
xyz"; my $file = *FP; printf $file "first\n"; $file = *STDOUT; printf $file "sec-6ren">
当我运行这个时:
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 不可见,文件将立即关闭。
关于perl - 我如何从 Perl 的 STDOUT 取消别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655719/
我是一名优秀的程序员,十分优秀!