当前位置:  开发笔记 > 编程语言 > 正文

如何从Perl的STDOUT中取消联合效果?

如何解决《如何从Perl的STDOUT中取消联合效果?》经验,为你挑选了2个好方法。

当我运行这个:

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的不同之处在于其表现如预期.

我究竟做错了什么?我不明白的是什么?



1> Kent Fredric..:

嗯,对于初学者来说,你错误地使用'开放'.

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超出可见性,文件就会关闭.



2> Telemachus..:

如果我明白你要做什么,我想你想用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";

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有