我有一个非常棘手的问题,我无法找到答案。
假设我们有一段执行常见任务的代码(例如,子代码),并且该代码的输出应根据某些条件定向到特定的文件句柄。
是否可以将目标文件句柄复制到本地变量?如果是的话怎么样?
如,
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";
答案 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";
完全像你期望的那样工作。 (请记住,如果你关闭一个,你就会关闭它们)