【问题标题】:Alias file handle to STDOUT in perlperl 中 STDOUT 的别名文件句柄
【发布时间】:2013-04-10 06:24:55
【问题描述】:

我有一个 perl 脚本,它打开一个文件并在其中写入一些数据。有时此文件在某些​​机器上具有只读权限。对于这种情况,目前脚本会因为无法打开文件而死掉。我的要求是,在这种情况下,我希望我的脚本继续运行,而不是将内容写入文件,而是将其放入 STDOUT。我将使用warn 而不是死,但我想知道我可以将我的文件句柄FILE1 别名为STDOUT,这样我就不必修改剩余的代码,原因在我的实际代码中print FILE1 <>存在于许多地方,我不可能将if\else 条件放在任何地方。我希望我将FILE1 别名为STDOUT 以便打印语句将其输出到STDOUT 或写入文件,具体取决于FILE1 文件句柄中设置的值。是否可以使用 perl?

$file = "testfile.txt";
open( FILE1, ">> $file" ) or die "Can not read file $file: $! \n";
print FILE1 "Line1 \n";
print FILE1 "Line2 \n";
print FILE1 "Line3 \n";
print FILE1 "Line4 \n";
close FILE1

【问题讨论】:

标签: perl


【解决方案1】:

您可以通过*FILE1 = STDOUT; 来实现。

前面带有* 的变量称为类型球。了解他们here

您可能还想开始使用lexical file handles

这就是我将如何解决您的问题:

use strict;
use warnings;

my $file = "testfile.txt";
my $succ = open( my $fh , '>>', $file );

$fh = *STDOUT unless $succ;

print $fh "Line1 \n";
print $fh "Line2 \n";
print $fh "Line3 \n";
print $fh "Line4 \n";

close $fh if $succ; # don't close STDOUT

【讨论】:

  • 我刚刚在我的 open 语句之后添加了这段代码并且它有效。你能告诉我如何检查文件句柄是否成功打开。现在即使文件是可访问的,它只是在 STDOUT 中打印文本,而不是在文件中。
  • open( FILE1, ">> $file" ) or *FILE1 = STDOUT; 将是一个非常简单的方法。
  • @dan1111 你如何区分指向 $file 的 FILE1 和指向 STDOUT 的 FILE1?我只是想知道,因为关闭 STDOUT 可能不是一个好主意。
  • @tauli,好吧,你可以检查一下*FILE1 eq *STDOUT。但是,除非有特殊需要(例如它是一个长时间运行的程序,或者我需要打开许多其他文件句柄),否则我根本不会费心关闭 FILE1。解释器在退出时自动关闭打开的文件。
  • @amon,除非我遗漏了什么,否则我相信*FILE1=STDOUT 意味着它们都指向同一个符号表,因此它们的计算结果会相等。见证这个愚蠢的代码:*FILE1=STDOUT; @FILE1 = ("foo"); $STDOUT = "bar"; print @STDOUT,$FILE1;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2015-04-13
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多