Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 (Perl)поочерёдный вывод строк из двух файлов  [new]
fanager
Member

Откуда:
Сообщений: 5
В общем стоит следующая задача, нужно перемешать содержимое двух файлов таким образом, чтобы строки из двух файлов выводились по очереди т.е. первая строка из файла file1, затем вторая строка должна быть первой строкой из файла file2, третья строка должна быть второй строкой из файла file2 и т.д. Также результат работы программы нужно вывести в третий файл file3.

#!/usr/bin/perl
open (file11, "<file1") or die($!);
my %hash1=<file11>;
while (<file11>)
{
chomp;
$hash1{$_}=0;
}
close (file11);
open (file22, "<file2") or die($!);
my %hash2=<file22>;
while (<file22>)
{
chomp;
$hash2{$_}=0;
}
close (file22);
while (eof(file11) and eof(file22))
{
my $line;
my %hash3;
if ($line=readline($hash1{$_}))
{
$hash3{$_}=0;
}
elsif ($line=readline($hash2{$_}))
{
$hash3{$_}=0;
}
elsif ($line=readline($hash1{$_}) and $line=readline($hash2{$_}))
{
next;
}
}
open (out, ">file3") or die($!);
foreach (keys(%hash3))
{
print out "$_\n";
}
close (out);
3 окт 17, 16:24    [20839488]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
fanager
Member

Откуда:
Сообщений: 5
Помогите новичку понять, что я делаю не так или предложите альтернативные варианты решения данной задачи.
3 окт 17, 16:25    [20839496]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 379
fanager,

use List::MoreUtils 'zip';
4 окт 17, 02:47    [20840706]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
scrip
Guest
Если есть гарантия, что файлы влазят в память
use strict;
use autodie;
use List::MoreUtils qw/zip/;
open my $A,"<file1";
open my $B,"<file2";
open my $C,">file3";
my @a=<$A>;
my @b=<$B>;
print $C $_ for zip @a, @b;
close $_ for $A, $B, $C;


Иначе
use strict;
use autodie;
open my $A,"<file1";
open my $B,"<file2";
open my $C,">file3";
my $a=1; my $b=1;
while ($a||$b){ 
  if ($a) { my $v=<$A>; $a=defined $v && print $C $v; }
  if ($b) { my $v=<$B>; $b=defined $v && print $C $v; }
}
close $_ for $A, $B, $C;
4 окт 17, 04:23    [20840713]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 379
Если надо реализовать самостоятельно, то сделал бы так:

открыть интересующие файлы( их может быть произвольное количество ),
handles засунуть в какой-нить список и читать в цикле построчно из нулевого индекса,
гоняя handles в этом списке по кольцу с помощью функций shift и push.

(В качестве списка можно использовать глобальный @_, чтобы типа пальцы поберечь)

#!/usr/bin/env perl -w
use strict;
use autodie;

open F1, 'file1.txt';
open F2, 'file2.txt';

push  @_, F1, F2;

while ( readline $_[0] ) {    

    print && push @_, shift;
}
4 окт 17, 04:33    [20840715]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 379
поочерёдный вывод строк для всех файлов в тек. каталоге:
( синтаксис постарался сделать как можно более загадочным, а то народ забыл уже, что такое perl ага)

use strict;
use autodie; 

open  $:: [$:: ++], $_ for <*> ;
print && push  @::,
         shift @::
	 while readline $::[0]
4 окт 17, 08:10    [20840779]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
fanager
Member

Откуда:
Сообщений: 5
volodin661, Можете немного поподробнее описать работу этой программы, просто если я пишу вот так ничего не работает
#!/usr/bin/perl
open $A, ">file1" or die($!);
open $B, ">file2" or die($!);
open $C, "<file3" or die($!);
my @a1=<$A>;
my @b1=<$B>;
while (readline $_[0])
{
if (readline @a1)
{print $C "@_\n" && push ( @a1 ), shift @a1;}
else
{print $C "@_\n" && push ( @b1 ), shift @b1;}
}
close for $A, $B, $C;
4 окт 17, 15:14    [20842468]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 379
fanager
volodin661, Можете немного поподробнее описать работу этой программы, просто если я пишу вот так ничего не работает


я могу поподробнее описать работу своей программы, хотя я это уже и сделал.

попробуй для начала запустить её в моей редакции, а потом поговорим. по результатам.

#!/usr/bin/env perl -w
use strict;
use autodie;

open F1, '<', 'file1.txt';
open F2, '<', 'file2.txt';
open F3, '>', 'file3.txt';

select F3;

my @handles;
push  @handles, F1, F2;

while ( readline $handles[0] ) {    

    print;
    push @handles, shift @handles;
}

close F1;
close F2;
close F3;
4 окт 17, 17:24    [20843060]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
fanager
Member

Откуда:
Сообщений: 5
volodin661, а ну кстати я тоже самое писал, только select не использовал (незнал, что есть такая удобная функция для вывода), но вот теперь проблема в том, что не распознаются дескрипторы файлов F1 и F2.
4 окт 17, 18:02    [20843173]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 379
да, каюсь, не проверил.
без use strict разумеется всё работать будет.

можно заменить все F на *F, тогда прагма strict заткнётся в тряпочку,
но правильный путь - заменить их на скаляры.

#!/usr/bin/env perl -w 
use strict;
use autodie;

open my $fh2, '<', '1';
open my $fh2, '<', '2';
open my $fh3, '>', '3';

select  $fh3;

push my (@handles), $fh1, $fh2;

while ( readline $handles[0] ) {    

    print;
    push @handles, shift @handles;
}

close $fh1;
close $fh2;
close $fh3;
4 окт 17, 18:37    [20843267]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 379
тьфу, в первом open $fh1, конечно.
4 окт 17, 18:40    [20843277]     Ответить | Цитировать Сообщить модератору
 Re: (Perl)поочерёдный вывод строк из двух файлов  [new]
fanager
Member

Откуда:
Сообщений: 5
volodin661,
Спасибо большое!!!Всё работает, но всё равно не могу понять почему не работает вот эта версия программы.
!/usr/bin/perl
open (my $file11, "<file1") or die($!);
open (my $file22, "<file2") or die($!);
my $a=1;
my $b=1;
while ($a or $b)
{

if ($a)
{
while (<file11>)
{
if (readline $file11[0]){
chomp;
my $hash1{$_}=0;
last;}
}
}
continue
{
if ($b)
{
while (<file22>)
{
if (readline $file22[0]){
chomp;
my $hash1{$_}=0;
last;}
}
}
}

}
open (out, ">file3") or die($!);
foreach (keys(%hash1))
{
print out "$_\n";
}
close for out, file11, file22;
9 окт 17, 10:32    [20853636]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить