使用Perl有多少种不同的方式逐行连接两个文件? [英] How many different ways are there to concatenate two files line by line using Perl?

查看:92
本文介绍了使用Perl有多少种不同的方式逐行连接两个文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设file1看起来像这样:

Suppose file1 looks like this:


bye bye
hello
thank you

file2看起来像这样:

And file2 looks like this:


chao
hola
gracias

所需的输出是这样:


bye bye chao
hello hola
thank you gracias

我本人已经想出了五种不同的方法来解决此问题.但是我认为必须有更多的方法,也许更简洁,更优雅的方法,希望我能学到更多有趣的东西:)

I myself have already come up with five different approaches to solve this problem. But I think there must be more ways, probably more concise and more elegant ways, and I hope I can learn more cool stuff :)

以下是我到目前为止的尝试,基于我从以前问题的许多解决方案中学到的知识.另外,我正在尝试对从骆马书中获得的知识进行消化或内部化.

The following is what I have tried so far, based on what I've learnt from the many solutions of my previous problems. Also, I'm trying to sort of digest or internalize the knowledge I've acquired from the Llama book.

代码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";
}

代码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];
}

代码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;

代码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;
}

代码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";
}

我尝试过这样的事情:

foreach $file1 (@file2) && foreach $file2 (@file2) {...}

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

But Perl gave me a syntactic error warning. I was frustrated. But can we run two foreach loops simultaneously?

一如既往地感谢您的任何评论,建议以及慷慨的代码共享:)

Thanks, as always, for any comments, suggestions and of course the generous code sharing :)

推荐答案

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

This works for any number of files:

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;

这篇关于使用Perl有多少种不同的方式逐行连接两个文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆