Запись в файл в Perl - PullRequest
       2

Запись в файл в Perl

3 голосов
/ 05 августа 2011

Я хочу написать пару ключей и значений, которые я заполнил в хэше. Я использую

open(OUTFILE,">>output_file.txt");
{
    foreach my $name(keys %HoH) {
        my $values = $HoH{$name};
        print "$name: $values\n";
    }
}
close(OUTFILE); 

Каким-то образом он создает output_file.txt, но не записывает в него данные. В чем может быть причина?

Ответы [ 4 ]

5 голосов
/ 05 августа 2011

Использование:

 print OUTFILE "$name: $values\n";

Не задавая дескриптор файла в операторе печати, вы печатаете в STDOUT, который по умолчанию является консолью.

4 голосов
/ 05 августа 2011
open my $outfile, '>>', "output_file.txt";

print $outfile map { "$_: $HOH{$_}\n" } keys %HoH;

close($outfile);

Я очистил код, используя функцию карты здесь было бы более кратким.Также я использовал свои переменные для файловых дескрипторов, всегда хорошая практикаЕсть еще несколько способов сделать это, вы должны проверить книгу Perl Cook, здесь

1 голос
/ 05 августа 2011

Когда вы открываете OUTFILE, у вас есть несколько вариантов, как писать в него.Во-первых, вы можете указать дескриптор файла в своих инструкциях печати, или два, вы можете выбрать дескриптор файла и затем печатать в обычном режиме (без указания дескриптора файла).Ты не делаешь ни того, ни другого.Я продемонстрирую:

use strict;
use warnings;
use autodie;

my $filename = 'somefile.txt';

open my( $filehandle ), '>>', $filename;
foreach my $name ( keys %HoH ) {
    print $filehandle "$name: $HoH{$name}\n";
}
close $filehandle;

Если бы вы использовали select, вы могли бы сделать это следующим образом:

use strict;
use warnings;
use autodie;

my $filename = 'somefile.txt';

open my( $filehandle ), '>>', $filename;
my $oldout = select $filehandle;
foreach my $name( keys %HoH ) {
    print "$name: $HoH{$name}\n";
}
close $filehandle;
select $oldout;

Каждый метод имеет свои применения, но чаще всего вЕсли вы заинтересованы в написании понятного и легкого для чтения / поддержки кода, вы используете первый подход, если только у вас нет веских причин.

Просто помните, что при печати в файл указывайте дескриптор файла в вашей печатизаявление.

0 голосов
/ 05 августа 2011

ответ sergio на указание дескриптора файла является лучшим.

Тем не менее, есть и другой способ: используйте select, чтобы изменить дескриптор файла вывода по умолчанию.И другой альтернативный способ сделать что-либо, использование while ( each ) вместо foreach ( keys ) может быть лучше в некоторых случаях (особенно, когда хеш-код каким-то образом привязан к файлу и потребуется много памяти, чтобы получить все ключи водин раз).

open(OUTFILE,">>output_file.txt");
select OUTFILE;
while (my ($name, $value) = each %HoH) {
    print "$name: $value\n";
}
close(OUTFILE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...