是否可以将文件句柄复制到另一个变量?

时间:2014-11-19 22:20:36

标签: perl

我有一个非常棘手的问题,我无法找到答案。

假设我们有一段执行常见任务的代码(例如,子代码),并且该代码的输出应根据某些条件定向到特定的文件句柄。

是否可以将目标文件句柄复制到本地变量?如果是的话怎么样?

如,

my $key;
my $tempFh;
my $targetFh1 = open (...);
my $targetFh2 = open (...);

if ($key eq "1")
{
   $tempFh = $targetFh1;
}
else
{
   $tempFh = $targetFh2;
}

#perform the common activity
print $tempFh "common activity\n";

2 个答案:

答案 0 :(得分:1)

唯一的问题是open

的语法
my $targetFh1 = open (...);
my $targetFh2 = open (...);

应该是

open(my $targetFh1, ...) or die $!;
open(my $targetFh2, ...) or die $!;

其余的都很好。

my $fh;
if ($key eq '1') {
   $fh = $targetFh1;
} else {
   $fh = $targetFh2;
}

print $fh "common activity\n";

(单词temp完全没有意义,所以我将其删除了。)

您可以使用的另一种语法是

my $fh = $key eq '1' ? $targetFh1 : $targetFh2;
print $fh "common activity\n";

甚至

print { $key eq '1' ? $targetFh1 : $targetFh2 } "common activity\n";

但除非print处于循环中且$key可以从循环传递更改为循环传递,否则没有理由打开这两个文件。你可以简单地使用

my $fh;
if ($key eq '1') {
   open($fh, ...) or die $!;
} else {
   open($fh, ...) or die $!;
}

print $fh "common activity\n";

答案 1 :(得分:0)

使用3个arg打开一个词法文件句柄:

open ( my $output_fh, ">", $output_filename ) or die $!;

分配文件句柄:

my $temp_fh_ref = $output_fh;
print {$temp_fh_ref} "Some text"; 

完全像你期望的那样工作。 (请记住,如果你关闭一个,你就会关闭它们)