Как я могу записать в Perl файловые дескрипторы, которые я храню в массиве? - PullRequest
5 голосов
/ 09 июня 2009

У меня есть список имен файлов. Я должен создать файл для каждого из этих имен, записать строки в различные файлы (в произвольном порядке), а затем закрыть их.

Как я могу сделать это в 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 $_;
}

Как я могу сделать это правильно?

Ответы [ 2 ]

14 голосов
/ 09 июня 2009

Аргумент дескриптора файла print должен быть голым словом, простым скаляром или блоком. Итак:

print { $handles[0] } ...

Это объясняется в perldoc -f print . То же ограничение применяется к синтаксису косвенного объекта в целом, а также к определению, когда <> является операцией чтения строки, а не операцией glob.

3 голосов
/ 09 июня 2009

Вот как бы я это сделал (не проверено, но я уверен, что это хорошо):

use IO::File;

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

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

Это ОО, у него более чистый интерфейс, и вам не нужно беспокоиться о его закрытии, поскольку он умрет, когда массив выйдет из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...