简体   繁体   中英

read multiple files using one loop perl

i have 2 files each having 50 lines..

FILE1 FILE2

now, i need to read two file lines by line in a single while or for loop and i should push the corresponding line to the 2 output arrays. i have tried something like this. but its not working out. kindly help

#!/usr/bin/perl

   my @B =();
   my @C =();
   my @D =();
   my $lines = 0;
   my $i = 0;
   my $sizeL = 0;
   my $sizeR = 0;
  my $gf = 0; 
  $inputFile = $ARGV[0];
  $outputFile = $ARGV[1];
  open(IN1FILE,"<$inputFile") or die "cant open output file ";
  open(IN2FILE,"<$outputFile") or die "cant open output file";

  while((@B=<IN1FILE>)&&(@C= <IN2FILE>))
  {
  my $line1 = <IN1FILE>;
  my $line2 = <IN2FILE>;
  print $line2;
  }

Here array 2 is not getting build.. but i am getting array 1 value.

In your loop condition, you read the whole files into their arrays. The list assignment is then used as a boolean value. This works only once, as the files will be read after the condition has been evaluated. Also, the readlines inside the loop will return undef.

Here is code that should work:

my (@lines_1, @lines_2);
# read until one file hits EOF
while (!eof $INFILE_1 and !eof $INFILE_2) {
  my $line1 = <$INFILE_1>;
  my $line2 = <$INFILE_2>;
  say "from the 1st file: $line1";
  say "from the 2nd file: $line2";
  push @lines_1, $line1;
  push @lines_2, $line2;
}

You could also do:

my (@lines_1, @lines_2);
# read while both files return strings
while (defined(my $line1 = <$INFILE_1>) and defined(my $line2 = <$INFILE_2>)) {
  say "from the 1st file: $line1";
  say "from the 2nd file: $line2";
  push @lines_1, $line1;
  push @lines_2, $line2;
}

Or:

# read once into arrays
my @lines_1 = <$INFILE_1>;
my @lines_2 = <$INFILE_2>;
my $min_size = $#lines_1 < $#lines_2 ? $#lines_1 : $#lines_2; # $#foo is last index of @foo
# then interate over data
for my $i ( 0 .. $min_size) {
  my ($line1, $line2) = ($lines_1[$i], $lines_2[$i]);
  say "from the 1st file: $line1";
  say "from the 2nd file: $line2";
}

Of course, I am assuming that you did use strict; use warnings; use strict; use warnings; and use feature 'say' , and used the 3-arg form of open with lexical filehandles:

my ($file_1, $file_2) = @ARGV;
open my $INFILE_1, '<', $file_1 or die "Can't open $file_1: $!"; # also, provide the actual error!
open my $INFILE_2, '<', $file_2 or die "Can't open $file_2: $!";

I also urge you to use descriptive variable names instead of single letters, and to declare your variables in the innermost possible scope — declaring vars at the beginning is almost the same as using bad, bad globals.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM