使用Perl逐行连接两个文件有多少种不同的方法?

Mik*_*ke 5 perl concatenation

假设file1看起来像这样:

bye bye
hello
thank you

而file2看起来像这样:

chao
hola
gracias

所需的输出是这样的:

bye bye chao
hello hola
thank you gracias

我自己已经提出了五种不同的方法来解决这个问题.但我认为必须有更多的方法,可能更简洁,更优雅的方式,我希望我能学到更多很酷的东西:)

以下是我迄今为止所尝试的内容,基于我从之前问题的许多解决方案中学到的内容.此外,我正试图消化或内化我从Llama书中获得的知识.

代码1:

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

open my $file1,'<','c:/file1.txt';
open my $file2,'<','c:/file2.txt';

while(defined(my $line1 = <$file1>)
        and defined(my $line2 = <$file2>)){
    die "Files are different sizes!\n" unless eof(file1) == eof(file2);
    $line1 .= $line2;
    $line1 =~ s/\n/ /;
    print "$line1 \n";
}
Run Code Online (Sandbox Code Playgroud)

代码2:

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

open my $file1,'<','c:/file1.txt';
my @file1 = <$file1>;

open my $file2,'<','c:/file2.txt';
my @file2 =<$file2>;

for (my $n=0; $n<=$#file1; $n++) {
    $file1[$n] .=$file2[$n];
    $file1[$n]=~s/\n/ /;
    print $file1[$n];
}
Run Code Online (Sandbox Code Playgroud)

代码3:

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

open my $file1,'<','c:/file1.txt';
open my $file2,'<','c:/file2.txt';

my %hash;

while(defined(my $line1 = <$file1>)
      and defined(my $line2 = <$file2>)) {
  chomp $line1;
  chomp $line2;
  my ($key, $val) = ($line1,$line2);
  $hash{$key} = $val;
}
print map { "$_ $hash{$_}\n" } sort keys %hash;
Run Code Online (Sandbox Code Playgroud)

代码4:

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

open my $file1,'<','c:/file1.txt';
open my $file2,'<','c:/file2.txt';

while(defined(my $line1 = <$file1>)
      and defined(my $line2 = <$file2>)) {
  $line1 =~ s/(.+)/$1 $line2/;
  print $line1;
}
Run Code Online (Sandbox Code Playgroud)

代码5:

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

open my $file1,'<','c:/file1.txt';
my @file1 =<$file1>;

open my $file2,'<','c:/file2.txt';
my @file2 =<$file2>;

while ((@file1) && (@file2)){ 
    my $m = shift (@file1);
    chomp($m);

    my $n = shift (@file2);
    chomp($n);

    $m .=" ".$n;
    print "$m \n";
}
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

foreach $file1 (@file2) && foreach $file2 (@file2) {...}
Run Code Online (Sandbox Code Playgroud)

但是Perl给了我一个语法错误警告.我很沮丧.但我们可以foreach同时运行两个循环吗?

一如既往地感谢任何评论,建议,当然还有慷慨的代码共享:)

FMc*_*FMc 12

这适用于任意数量的文件:

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;
Run Code Online (Sandbox Code Playgroud)


mou*_*iel 10

最优雅的方式根本不涉及perl:

paste -d' ' file1 file2
Run Code Online (Sandbox Code Playgroud)

  • 在Perl中:`system("paste -d''$ file1 $ file2")` (4认同)
  • +1同意,但我认为OP的目的是通过制作这样的玩具程序来学习Perl. (2认同)

Sin*_*nür 7

如果我是一名高尔夫球手,我可以将@ FM的答案重写为:

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

你可能会变成一个单行,但这只是邪恶.;-)

嗯,这里是100个字符以下:

C:\Temp> perl -le "$,=' ';@_=@ARGV;open $_,$_ for @_;print map{chomp($a =<$_>);$a} @_=grep{!eof $_ }@_ while @_" file1 file2

如果可以啜饮(以及为什么不这样做 - 我们正在寻找不同的方式),我想我已经发现了疯狂的道路:

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

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

输出:

bye bye chao
hello hola
thank you gracias