xyz"; my $file = *FP; printf $file "first\n"; $file = *STDOUT; printf $file "sec-6ren">
gpt4 book ai didi

perl - 我如何从 Perl 的 STDOUT 取消别名?

转载 作者:行者123 更新时间:2023-12-01 09:27:10 25 4
gpt4 key购买 nike

当我运行这个时:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com