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

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

открыть интересующие файлы( их может быть произвольное количество ),
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
(Perl)поочерёдный вывод строк из двух файлов
    #39530565
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поочерёдный вывод строк для всех файлов в тек. каталоге:
( синтаксис постарался сделать как можно более загадочным, а то народ забыл уже, что такое perl ага)

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

open  $:: [$:: ++], $_ for <*> ;
print && push  @::,
         shift @::
	 while readline $::[0]
...
Рейтинг: 0 / 0
(Perl)поочерёдный вывод строк из двух файлов
    #39530826
fanager
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
(Perl)поочерёдный вывод строк из двух файлов
    #39530974
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(Perl)поочерёдный вывод строк из двух файлов
    #39530998
fanager
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661, а ну кстати я тоже самое писал, только select не использовал (незнал, что есть такая удобная функция для вывода), но вот теперь проблема в том, что не распознаются дескрипторы файлов F1 и F2.
...
Рейтинг: 0 / 0
(Perl)поочерёдный вывод строк из двух файлов
    #39531038
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, каюсь, не проверил.
без 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
(Perl)поочерёдный вывод строк из двух файлов
    #39531042
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу, в первом open $fh1, конечно.
...
Рейтинг: 0 / 0
(Perl)поочерёдный вывод строк из двух файлов
    #39533244
fanager
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl)поочерёдный вывод строк из двух файлов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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