Создание файлов aa..zz и запись AA..ZZ в файлы с помощью оператора диапазона - PullRequest
0 голосов
/ 24 февраля 2012

Я очень новичок в Perl и у меня есть вопрос.Я пытаюсь создать файлы в каталоге и записать в эти файлы.Вот что у меня есть, он создает каталоги, но ничего в них не записывает.Я не могу понять, как писать в файлы, я смотрел на создание тройника или многомерного массива, но это не сработало.

#!/usr/bin/perl
use strict;
use warnings;

my @alpha = ("aa".."bb");


for my $combo(@alpha)
{
open(DFILE,"+>$combo") || die "die open failed";

while (<DFILE>)
{
   print $_;
}
close(DFILE);
}

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Следующее создает 28 файлов и записывает в файл верхний регистр имени файла. Например, он создает файл с именем aa, содержащий одну строку: AA.

use warnings;
use strict;
use File::Slurp;

for ('aa' .. 'bb') {
    write_file($_, uc $_);
}

См. Файл :: Slurp .

1 голос
/ 24 февраля 2012

Короче говоря, чтобы записать что-то в файл, открытый с помощью дескриптора DFILE, вы должны использовать

 print DFILE 'something to print';

Но я немного запутался в ваших целях, особенно в том, что именно вы собираетесь записывать в эти файлы. Не могли бы вы уточнить это?

0 голосов
/ 24 февраля 2012

Вы открываете файлы для записи (>) и улучшаете их для чтения (+). После открытия файла вы читаете из его файлового дескриптора и распечатываете то, что прочитали, в файловом дескрипторе по умолчанию (STDOUT). Когда вы закончите, вы закрываете файл.

Если файл еще не существует, вы создадите его, не будет ничего для чтения (и ничего для печати), и вы закроете все еще пустые файлы.

Я не знаю, что вы пытаетесь сделать. Если вы пытаетесь добавить строки в файл, вы можете вместо этого открыть его для добавления (>>). Когда вы хотите напечатать этот дескриптор файла, вы должны указать print, какой дескриптор файла вы хотите использовать:

#!/usr/bin/perl
use strict;
use warnings;

my @alpha = ("aa".."ab");

for my $combo ( @alpha ) {
    open my $fh, ">>", $combo or die "die open failed: $!";

    printf $fh "[%s] Here's a new line in $combo\n", scalar localtime;
    }

Это производит файлы с выводом как:

[Fri Feb 24 09:07:17 2012] Here's a new line in aa
[Fri Feb 24 09:08:52 2012] Here's a new line in aa

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

#!/usr/bin/perl
use strict;
use warnings;

use IO::Tee; # get from CPAN

my @alpha = ("aa".."ab");

for my $combo ( @alpha ) {
    open my $fh, ">>", $combo or die "die open failed: $!";
    my $tee = IO::Tee->new( $fh, \*STDOUT );
    printf $tee "[%s] Here's a new line in $combo\n", scalar localtime;
    }

Теперь каждая строка вывода идет в два места: экран и файл.

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