Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Последовательное чтение из нескольких файлов одновременно (Enilatiar)
Author Message
Enilatiar
Участник форума



Joined: 09 Jun 2003
Posts: 690
Карма: 24
   поощрить/наказать


PostPosted: Thu Dec 25, 2003 3:59 pm ()
   Post subject: Последовательное чтение из нескольких файлов одновременно
Reply with quote

Задача: Есть несколько текстовых файлов. Необходимо печатать последовательно по одной строчке из каждого файла.

Требования:
Т1. Имена файлов задаются в командной строке.
T2. Все файлы целиком в память загонять нельзя.
T3. Других файлов создавать нельзя. Исключение, - вывод можно осуществлять в результирующий файл.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 25, 2003 5:05 pm (спустя 1 час 6 минут)
   Post subject:
Reply with quote

Code (perl): скопировать код в буфер обмена
use Symbol;
my @F = map (www.perldoc.com/perl5.6/pod/func/map.html) { open (www.perldoc.com/perl5.6/pod/func/open.html) my $f=gensym, $_; $f } @ARGV;
while (1) {
  my $printed = 0;
  foreach (@F) {
    next if eof (www.perldoc.com/perl5.6/pod/func/eof.html) $_;
    print (www.perldoc.com/perl5.6/pod/func/print.html) scalar (www.perldoc.com/perl5.6/pod/func/scalar.html) <$_>;
    $printed++;
  }
  last if !$printed;
}
Back to top
View user's profile Send private message Send e-mail
Enilatiar
Участник форума



Joined: 09 Jun 2003
Posts: 690
Карма: 24
   поощрить/наказать


PostPosted: Thu Dec 25, 2003 5:16 pm (спустя 10 минут)
   Post subject:
Reply with quote

Способ немного сбоит на последних строчках файлов, которые не заканчиваются \n

Вот некрасивое, но лекарство:
Code (perl): скопировать код в буфер обмена
use Symbol;
my @F = map (www.perldoc.com/perl5.6/pod/func/map.html) { open (www.perldoc.com/perl5.6/pod/func/open.html) my $f=gensym, $_; $f } @ARGV;

while (1) {
    my $printed = 0;
    foreach (@F) {
        next if eof (www.perldoc.com/perl5.6/pod/func/eof.html) $_;
        my $s = scalar (www.perldoc.com/perl5.6/pod/func/scalar.html) <$_>;
        chomp (www.perldoc.com/perl5.6/pod/func/chomp.html) $s;
        print (www.perldoc.com/perl5.6/pod/func/print.html) $s, "\n";
        $printed++;
    }
    last if !$printed;
}
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 25, 2003 6:23 pm (спустя 1 час 7 минут)
   Post subject:
Reply with quote

Явно закрывать файлы не нужно — сами закроются, как только @F уйдет за пределы видимости. Достаточно сделать так:
Code (perl): скопировать код в буфер обмена
{{{
use Symbol;
my @F = map (www.perldoc.com/perl5.6/pod/func/map.html) { open (www.perldoc.com/perl5.6/pod/func/open.html) my $f=gensym, $_; $f } @ARGV;
...
}}}


Last edited by Дмитрий Котеров on Wed Dec 31, 2003 6:34 pm; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Thu Dec 25, 2003 6:54 pm (спустя 30 минут)
   Post subject:
Reply with quote

Полагаю, даже одних окружающих скобок будет достаточно.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Wed Dec 31, 2003 6:35 pm (спустя 5 дней 23 часа 41 минуту)
   Post subject:
Reply with quote


М

Перенесено из форума: Программирование::Perl::Все в кучу.
Перенесено в форум: Программирование::Perl::Склад готовых решений.
Back to top
View user's profile Send private message Send e-mail
Enilatiar
Участник форума



Joined: 09 Jun 2003
Posts: 690
Карма: 24
   поощрить/наказать


PostPosted: Mon Jan 05, 2004 4:36 pm (спустя 4 дня 22 часа 1 минуту)
   Post subject:
Reply with quote

Code (perl): скопировать код в буфер обмена
use Symbol;
my @F = map (www.perldoc.com/perl5.6/pod/func/map.html) { open (www.perldoc.com/perl5.6/pod/func/open.html) my $f=gensym, $_; $f } @ARGV;

while ($_ = shift (www.perldoc.com/perl5.6/pod/func/shift.html) @F) {
    next  if eof (www.perldoc.com/perl5.6/pod/func/eof.html) $_;
    chomp (www.perldoc.com/perl5.6/pod/func/chomp.html) ( my $s = scalar (www.perldoc.com/perl5.6/pod/func/scalar.html) <$_> );
    print (www.perldoc.com/perl5.6/pod/func/print.html) $s, "\n";
    push (www.perldoc.com/perl5.6/pod/func/push.html) @F, $_;
}

close (www.perldoc.com/perl5.6/pod/func/close.html) $_  foreach @F;
Слегка модифицированный вариант кода 1) с одним циклом; 2) без флажка $printed; 2) с явным закрытием файлов.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML