2

Perl で 2 つの異なるファイルを 1 行ずつ交互に印刷しようとしています。これの構文は何ですか? コード:

#1. Initialize: log file path and ref Log file path
use strict;
use warnings;
my $flagRef="true";
my $logPath="C:/ExecutionSDKTest_10.2.2/Logs/${ARGV[0]}.log";
my $refLogPath="C:/ExecutionSDKTest_10.2.2/Logs/${ARGV[1]}_Ref.properties.txt";
#print log file path followed by reflog path: P
#print "$logPath\n$refLogPath\n";

#2. Traverse log file and refLog file to replace ALL instances of:
#"hr:min:sec" with "xx:xx:xx" 
open INLOG, $logPath or die $!;
open INREF, $refLogPath or die $!;

#equiv: >>$logLine=readline(*FHLOG);        
#$logLine= <FHLOG>;
#$refLine= <FHREF>;
while (<INLOG>) #syntax
{
   print "$_";
   #I'd like to print lines from INREF too! :)
   #Syntax?
 }
4

4 に答える 4

3

これは、paste(1) を使用して簡単に解決できます。a.txt に次のものが含まれているとします。

a1
a2
a3

b.txt には以下が含まれます。

b1
b2
b3

それで:

$ paste -d '\n' a.txt b.txt
a1
b1
a2
b2
a3
b3
$ 

同じことを行うための少し長い Perl ワンライナー:

$ perl -e '@fhs=map { open my $fh, "<", $_; $fh } @ARGV; while (!$done) { $done=1; map { $v=<$_>; do { print $v; $done=0 } if (defined $v); } @fhs; }' a.txt b.txt
a1
b1
a2
b2
a3
b3
$ 

それを展開して適切なスクリプトに書き直すことは、読者の演習として残されています。

于 2012-07-05T18:43:11.750 に答える
2

これは、あなたが求めていることを実行する簡単なスクリプトです。

#!/usr/bin/perl
use strict;

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

my @arr1 = <FILE1>;
my @arr2 = <FILE2>;

if(@arr1 > @arr2) {
    print_arrs(\@arr1,\@arr2);
}
else {
    print_arrs(\@arr2,\@arr1);
}

sub print_arrs {
    my ($arr1,$arr2) = @_;
    for(my $k = 0; $k < @{$arr1}; $k++) {
        print @{$arr1}[$k];
        print @{$arr2}[$k] if @{$arr2}[$k];
    }
}

これは最もエレガントなソリューションではないかもしれませんが、あなたが求めていることを実行します!

于 2012-07-05T18:15:57.380 に答える
1

while一般に、ファイル全体をメモリに読み込むよりも、ファイルをループで処理することをお勧めします。

このプログラムは、要求に応じて 2 つのファイルから行を交互に表示します。

use strict;
use warnings;

my $logPath = sprintf 'C:/ExecutionSDKTest_10.2.2/Logs/%s.log', shift;
my $refLogPath = sprintf 'C:/ExecutionSDKTest_10.2.2/Logs/%s_Ref.properties.txt', shift;

open my $inlog, '<', $logPath or die qq(Unable to open "$logPath": $!);
open my $inref, '<', $refLogPath or die qq(Unable to open "$refLogPath": $!);

do {
  print if defined($_ = <$inlog>);
  print if defined($_ = <$inref>);
} until eof $inlog and eof $inref;
于 2012-07-06T22:43:50.070 に答える
0

質問で使用されている方法に似た別の方法は次のとおりです。

use strict;
use warnings;

open( my $h1, '<', 'a.txt' );
open( my $h2, '<', 'b.txt' );

for(;;)
{
    my $x    = <$h1>;
    my $y    = <$h2>;
    defined($x) || defined($y)
        or last;
    print $x // '';
    print $y // '';
}
于 2012-07-06T22:28:41.983 に答える