2011-01-26 21 views
2

我有以下代碼:在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', 
     '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); 
} 

在代碼中,我得到$組織爲「S2」的後半部分。

my $org="S2"; 

基於$組織我會決定我需要打印並在這種情況下,它是/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. 

請幫助。

+1

如果您使用`use warnings`啓用警告,Perl會警告您'$ key`重新聲明。我猜你的意圖是使用它的價值作爲文件句柄的名稱 – 2011-01-26 16:10:18

回答

1

使用哈希:

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"; 

順便說一句,如果您使用open my $fh, ...形式的open$fh應該是不確定的。否則,它的值被用作想要的真實文件句柄的名稱。這被認爲是一個符號參考,因此該腳本不會在「use strict 'refs'」下編譯。

3

使用$filehandles作爲哈希(或hashref),而不是一個數組引用,因爲這樣的:

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"; 

最後,不要忘了迭代keys %{$filehandles}closeopen編輯文件了。

相關問題