5

ファイル名のリストがあります。これらの名前ごとにファイルを作成し、さまざまなファイルに行を書き込んで (順不同で)、それらを閉じる必要があります。

どうすればperlでそれを行うことができますか? 次のコードのようなものを想定しています (その形式では機能せず、構文エラーが発生します)。

my @names = qw(foo.txt bar.txt baz.txt);
my @handles;

foreach(@names){
  my $handle;
  open($handle, $_);
  push @handles, $handle; 
}

# according to input etc.:
print $handles[2] "wassup";
print $handles[0] "hello";
print $handles[1] "world";
print $handles[0] "...";

foreach(@handles){
  close $_;
}

どうすればこれを正しく行うことができますか?

4

2 に答える 2

15

のファイルハンドル引数はprint、ベアワード、単純なスカラー、またはブロックでなければなりません。そう:

print { $handles[0] } ...

これはperldoc -f printで説明されています。同じ制限が一般的な間接オブジェクト構文に適用され、 <> がグロブ操作ではなく readline 操作である場合を判断する場合にも適用されます。

于 2009-06-09T03:50:31.983 に答える
3

これが私がそれを行う方法です(テストされていませんが、それが良いと確信しています):

use IO::File;

# ...
my @handles = map { IO::File->new($_, 'w') } @names;

$handles[2]->print("wassup");
# ...

これは OO であり、よりクリーンなインターフェイスを備えており、配列がスコープ外になると終了するため、それらを閉じることを心配する必要はありません。

于 2009-06-09T04:00:15.293 に答える