Сколько различные пути там для конкатенации двух файлов линию за линией с помощью Perl?

Почему не только указывают на Вашу основную страницу на js хостинг файлов Google ? Тогда, даже когда это приходит к развертыванию (принимающий Ваш сайт, Сеть стоит), можно ли злоупотребить, возможно предварительно кэшировал файлы jQuery?

5
задан 3 revs, 3 users 87% 26 September 2012 в 01:38
поделиться

5 ответов

Это работает для любого количества файлов:

use strict;
use warnings;
use autodie;

my @handles = map { open my $h, '<', $_; $h } @ARGV;

while (@handles){
    @handles = grep { ! eof $_ } @handles;
    my @lines = map { my $v = <$_>; chomp $v; $v } @handles;
    print join(' ', @lines), "\n";
}

close $_ for @handles;
12
ответ дан 18 December 2019 в 05:33
поделиться

Самый элегантный способ вообще не требует использования perl :

paste -d' ' file1 file2
10
ответ дан 18 December 2019 в 05:33
поделиться

Простой с минимальной проверкой ошибок:

#!/usr/bin/perl -w

use strict;

open FILE1, '<file1.txt';
open FILE2, '<file2.txt';

while (defined(my $one = <FILE1>) or defined(my $twotemp = <FILE2>)){
    my $two = $twotemp ? $twotemp : <FILE2>;
    chomp $one if ($one);
    chomp $two if ($two);
    print ''.($one ? "$one " : '').($two ? $two : '')."\n";
}

И нет, вы не можете запускать два цикла одновременно в одном потоке, вам придется fork , но это не гарантирует синхронную работу.

2
ответ дан 18 December 2019 в 05:33
поделиться

Более простая альтернатива вашему Коду 5 , которая допускает произвольное количество строк и не заботится о том, имеют ли файлы разное количество строк (наконечник шляпы @FM):

#!/usr/bin/perl

use strict; use warnings;

use File::Slurp;
use List::AllUtils qw( each_arrayref );

my @lines = map [ read_file $_ ], @ARGV;

my $it = each_arrayref @lines;

while ( my @lines = grep { defined and chomp and length } $it->() ) {
    print join(' ', @lines), "\n";
}

И без использования каких-либо внешних модулей:

#!perl
use autodie; use warnings; use strict;

my ($file1, $file2) = @ARGV;

open my $file1_h,'<', $file1;
my @file1 = grep { chomp; length } <$file1_h>;

open my $file2_h,'<', $file2;
my @file2 =  grep { chomp; length } <$file2_h>;

my $n_lines = @file1 > @file2 ? @file1 : @file2;

for my $i (0 .. $n_lines - 1) {
    my ($line1, $line2) = map {
        defined $_ ? $_ : ''
    } $file1[$i], $file2[$i];
    print $line1, ' ', $line2, "\n";
}

Если вы хотите объединить только строки, которые появляются в обоих файлах:

#!perl
use autodie; use warnings; use strict;

my ($file1, $file2) = @ARGV;

open my $file1_h,'<', $file1;
my @file1 = grep { chomp; length } <$file1_h>;

open my $file2_h,'<', $file2;
my @file2 =  grep { chomp; length } <$file2_h>;

my $n_lines = @file1 < @file2 ? @file1 : @file2;

for my $i (0 .. $n_lines - 1) {
    print $file1[$i], ' ', $file2[$i], "\n";
}
2
ответ дан 18 December 2019 в 05:33
поделиться

Если бы я был любителем гольфа, я мог бы переписать @ Ответ FM как:

($,,$\)=(' ',"\n");@_=@ARGV;open $_,$_ for @_;print
map{chomp($a=<$_>);$a} @_=grep{!eof $_} @_ while @_

, который вы могли бы превратить в однострочник, но это просто зло. ; -)

Вот оно, до 100 символов:

C: \ Temp> perl -le "$, = ''_ = @ ARGV ; открыть $ _, $ _ для @_; распечатать карту {chomp ($ a = <$ _>); $ a} @ _ = grep {! Eof $ _} @_ while @_ "file1 file2

Если хлебать - это нормально (и почему, черт возьми, мы ищем разные пути), то я думаю, что обнаружил путь безумия:

@_=@ARGV;chomp($x[$.-1]{$ARGV}=$_) && eof
and $.=0 while<>;print "@$_{@_}\n" for @x

C: \ Temp> perl - e "@ _ = @ ARGV; chomp ($ x [$ .- 1] {$ ARGV} = $ _) && eof и $. = 0 while <>; print qq {@ $ _ {@_} \ n} для @x "file1 file2

Вывод:

bye bye chao
hello hola
thank you gracias
7
ответ дан 18 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: