Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl)поочерёдный вывод строк из двух файлов / 12 сообщений из 12, страница 1 из 1
03.10.2017, 16:24
    #39530291
fanager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
В общем стоит следующая задача, нужно перемешать содержимое двух файлов таким образом, чтобы строки из двух файлов выводились по очереди т.е. первая строка из файла 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);
...
Рейтинг: 0 / 0
03.10.2017, 16:25
    #39530295
fanager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
Помогите новичку понять, что я делаю не так или предложите альтернативные варианты решения данной задачи.
...
Рейтинг: 0 / 0
04.10.2017, 02:47
    #39530547
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
fanager,

Код: php
1.
use List::MoreUtils 'zip';
...
Рейтинг: 0 / 0
04.10.2017, 04:23
    #39530550
scrip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
Если есть гарантия, что файлы влазят в память
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;



Иначе
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;
...
Рейтинг: 0 / 0
04.10.2017, 04:33
    #39530552
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
Если надо реализовать самостоятельно, то сделал бы так:

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

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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#!/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;
}
...
Рейтинг: 0 / 0
04.10.2017, 08:10
    #39530565
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
поочерёдный вывод строк для всех файлов в тек. каталоге:
( синтаксис постарался сделать как можно более загадочным, а то народ забыл уже, что такое perl ага)

Код: perl
1.
2.
3.
4.
5.
6.
7.
use strict;
use autodie; 

open  $:: [$:: ++], $_ for <*> ;
print && push  @::,
         shift @::
	 while readline $::[0]
...
Рейтинг: 0 / 0
04.10.2017, 15:14
    #39530826
fanager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
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;
...
Рейтинг: 0 / 0
04.10.2017, 17:24
    #39530974
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
fanagervolodin661, Можете немного поподробнее описать работу этой программы, просто если я пишу вот так ничего не работает


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

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

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#!/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;
...
Рейтинг: 0 / 0
04.10.2017, 18:02
    #39530998
fanager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
volodin661, а ну кстати я тоже самое писал, только select не использовал (незнал, что есть такая удобная функция для вывода), но вот теперь проблема в том, что не распознаются дескрипторы файлов F1 и F2.
...
Рейтинг: 0 / 0
04.10.2017, 18:37
    #39531038
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
да, каюсь, не проверил.
без use strict разумеется всё работать будет.

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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#!/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;
...
Рейтинг: 0 / 0
04.10.2017, 18:40
    #39531042
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
тьфу, в первом open $fh1, конечно.
...
Рейтинг: 0 / 0
09.10.2017, 10:32
    #39533244
fanager
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl)поочерёдный вывод строк из двух файлов
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;
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl)поочерёдный вывод строк из двух файлов / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]