当我运行这个:
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";
Run Code Online (Sandbox Code Playgroud)
"第四"印刷品不是STDOUT,而是"abc".
STDOUT与FP的不同之处在于其表现如预期.
我究竟做错了什么?我不明白的是什么?
Ken*_*ric 11
嗯,对于初学者来说,你错误地使用'开放'.
open my $fp , '>', 'xyz' ;
Run Code Online (Sandbox Code Playgroud)
是推荐的语法.
强烈建议您使用裸露的'FP',因为它不是词汇.
其次,你将文件指针重新打开为新事物.这不是很好的做法,它应该不是问题,但它只是一个坏主意.你应该关闭文件指针或让它超出范围(通过词法).
第三,'*STDOUT'是一个参考.
my $fh = *STDOUT;
print "$fh\n"; #prints '*main::STDOUT';
Run Code Online (Sandbox Code Playgroud)
所以当你这样做时:
open $fh, '>abc';
Run Code Online (Sandbox Code Playgroud)
你在做
open *STDOUT, '>abc';
Run Code Online (Sandbox Code Playgroud)
如果你之后立即做
print "$fh\n";
Run Code Online (Sandbox Code Playgroud)
你会注意到它仍然打印*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
Run Code Online (Sandbox Code Playgroud)
以下是使用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 ');
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果省略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";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2865 次 |
| 最近记录: |