2011-01-26 6 views
2

I次のコードを持っている:コードの後半では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); 
} 

を、I GET $ orgの "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

警告を「警告を使用」で有効にすると、Perlは '$ key'が再宣言されたことを警告します。あなたの意図は、ファイルハンドル名としての値を使うことだったと思います。 –

+0

常に、*常に* use strictとuse warningsの両方を使用します。エラーメッセージが何を意味するかわからない場合は、 'use diagnostics;'も追加してください。 – Ether

答えて

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

あなたがopenopen my $fh, ...フォームを使用している場合ところで、$fhは未定義でなければなりません。それ以外の場合は、その値が実際のファイルハンドルの名前として使用されます。これはシンボリックリファレンスと見なされるため、スクリプトは "use strict 'refs'"の下でコンパイルされません。

3

などのハッシュ(またはハッシュリファレンス)の代わりに、配列リファレンスとして使用$filehandles

終わり
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}超えるとcloseあなたopen編ファイルを反復することを忘れないでください。

関連する問題