在perl中,如何打印到文件句柄在运行时解析的文件?

在perl中,如何打印到文件句柄在运行时解析的文件?,perl,Perl,我有以下代码: use strict; my $org_file_hash = { 'S6' => '/path/to/file/filename.txt_S6', 'S8' => '/path/to/file/filename.txt_S8', 'S2' => '/path/to/file/filename.txt_S2', 'S0' => '/path/to/file/filename.txt_S0', 'S

我有以下代码:

use strict;
my $org_file_hash = {
      'S6' => '/path/to/file/filename.txt_S6',
      'S8' => '/path/to/file/filename.txt_S8',
      'S2' => '/path/to/file/filename.txt_S2',
      'S0' => '/path/to/file/filename.txt_S0',
      'S00' => '/path/to/file/filename.txt_S00'
    };
my $filehandles;
for(keys %{$org_file_hash})
{
    my $key=$_;
    open(my $key,">",$org_file_hash->{$key}) || die "Cannot open ".$org_file_hash->{$key}." for writing: $!";
    push(@{$filehandles},$key);
}
在代码的后半部分,我得到$org作为“S2”

根据$org,我将决定需要打印到的文件,在本例中为/path/to/file/filename.txt_S2

为了实现这一目标,我正在做以下工作,但它不起作用:

my $org="S2";
print {$org} "hello world\n";
我得到以下错误:

Can't use string ("S2") as a symbol ref while "strict refs" in use at new_t.pl line 22.

请提供帮助。

使用
$filehandles
作为哈希(或hashref)而不是arrayref,如下所示:

my $filehandles = {};
for my $key (keys %{$org_file_hash})
{
    # my $key=$_;     # redundant
    open( my $fh, '>', $org_file_hash->{$key} )
        or die "Cannot open ".$org_file_hash->{$key}." for writing: $!";
    $filehandles->{$key} = $fh;
}

# later...
my $org = 'S2';
print { $filehandles->{$org} } "Hello, world.\n";
最后,不要忘记迭代
键%{$filehandles}
close
您的
打开的
ed文件。

使用哈希:

my $filehandles = {};

for my $key (keys %{$org_file_hash}) {
    open my $fh, ">", $org_file_hash->{$key} or die $!;    
    $filehandles->{$key} = $fh;    
}
my $org="S2";
print {$filehandles->{$org}} "hello world\n";

顺便说一句,如果您使用
打开我的$fh,…
格式的
打开
$fh
应该是未定义的。否则,它的值将用作所需的实际文件句柄的名称。这被认为是一个符号引用,因此脚本不会在“
使用严格的“refs”
”下编译。如果您使用
使用警告启用警告,Perl将警告您重新声明了
$key
。我猜您的意图是使用它的值作为filehandle名称始终,始终使用
use strict
使用警告。如果不确定错误消息的含义,请添加
使用诊断
my $filehandles = {};

for my $key (keys %{$org_file_hash}) {
    open my $fh, ">", $org_file_hash->{$key} or die $!;    
    $filehandles->{$key} = $fh;    
}
my $org="S2";
print {$filehandles->{$org}} "hello world\n";