В Perl, как я могу печатать в файл, дескриптор файла которого разрешается во время выполнения? - PullRequest
2 голосов
/ 26 января 2011

У меня есть следующий код:

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

my $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.

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 26 января 2011

Используйте $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";

В конце не забудьте перебрать keys %{$filehandles} и close ваших open файлов ed.

1 голос
/ 26 января 2011

Используйте хэш:

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'».

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