Пусть file1 выглядит следующим образом:Сколько различных способов объединить два файла по строкам, используя Perl?
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";
}
Код 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
?
Спасибо, как всегда, за любые комментарии, предложения и, конечно, обмен щедрым код :)
Не проводке почти идентичный вопрос в последнее время? – 2009-10-28 12:15:39
На самом деле, это звучит как вопрос типа опроса, и никто не отвечает правильно, поэтому, вероятно, должен быть CW. –
@ Kinopiko, этот вопрос, который я задал пару дней назад. «Как заменить столбец одного файла на столбец другого с помощью Perl?» было сложнее, чем эта. – Mike