Compare arrays (perl)

Hi,

my first post here!

Description of my problem:

I have one txt-file with six rows and each row contains seven numbers seperated with whitespaces.

I want to:

Compare one array with seven numbers with each row of numbers in the txt-file.

I have managed to compare one array with another with seven numbers (fairly easy), the problem is that i can't figure out how to create six different arrays with the numbers with the rows in the txt-file and then compare them with a single array. I've used qw() to create the array so the values are in fact strings. :slight_smile:

open(FILE, "numfile.txt") || die $!;
my @rows = <FILE>;

I understand that the array @rows now contains six elements and each element is a string with seven numbers seperated with whitespaces.
Is there a way to loop through the @rows array and split the strings into seven different values, populate six arrays with these values and then compare them with an independent array?

Thanks!

What do you mean by compare? Could you give an example?
You may use array of arrays to hold your input file.

For example:

  1. Generate some data (this is zsh):
[11:50][dimitre@ubuntu][/home/dimitre/t]$ for j ({1..6}) {
  for i ({1..7}) {
    printf "%d " $((RANDOM%100))
    }
  print
  }
84 90 86 48 19 94 38 
69 64 65 23 81 57 6 
25 72 6 62 72 94 97 
21 97 20 36 10 34 14 
25 27 91 41 49 77 90 
0 3 60 1 68 26 24 

Use AoA to hold your arrays (the numbers do not match, because I'm using the RANDOM variable):

[11:51][dimitre@ubuntu][/home/dimitre/t]$ for j ({1..6}) {
  for i ({1..7}) {
    printf "%d " $((RANDOM%100))
    }
  print
  } | perl -MData::Dumper -lane'
  push @arrays, [@F];
  print Dumper \@arrays if eof
  ' infile
$VAR1 = [
          [
            '39',
            '76',
            '75',
            '11',
            '37',
            '0',
            '6'
          ],
          [
            '19',
            '23',
            '8',
            '66',
            '84',
            '24',
            '53'
          ],
          [
            '35',
            '79',
            '23',
            '27',
            '82',
            '90',
            '2'
          ],
          [
            '80',
            '27',
            '24',
            '59',
            '10',
            '25',
            '12'
          ],
          [
            '79',
            '91',
            '54',
            '19',
            '99',
            '61',
            '62'
          ],
          [
            '36',
            '62',
            '68',
            '87',
            '17',
            '9',
            '53'
          ]
        ];

hello ,
so you have one array of numbers to compare with all the rows if I am not mistaken.
So here is a start

#/usr/local/bin/perl -w 
open(FILE,"<your_file.txt") or die($!);
while(<FILE>){
split(/\s+/);
##not compare your arrary with @_ by using accessing members $_[0],$_[1]..... .. etc. ### 

radulov:

I want to compare the 12 rows with one independent row, to see how many numbers that match in each row with the independent row.
I've actually tried to use AoA but i couldn't figure out the code how to access each array and compare the values with the values in the independent array. I'm going to try using AoA again, guess i didn't take the time to actually learn it. :slight_smile:

gaurav1086:

Yes, that is correct. Never tried the split-function with strings, im going to check that one out!

Thinking on similar lines... i think the following code works:

open(SRC,"file location");
@sample = (23,32,45,54,56,65);

while(<SRC>){
chomp(@_);

@new = split(/\s+/);

$count = 0;$y=0;
foreach $x (@sample){


foreach $y (@new){

if($x eq $y){
$count++;

}#if ends
}#foreach $y ends


}#foreach ends
print "\n\n $count matches.\n";

}


close SRC;

file contents are as follows:

21 12 29 92 28 82
23 32 45 54 65 56

You can use something like this:

#!/usr/bin/perl

use warnings;
use strict;

my @indi_numbers = ( 16, 35, 11, 30, 8, 9 );

open my $infile, '<', shift or die "open: $!\n";

while (<$infile>) {
    my %uniq;
    $uniq{$_} = 1 for split;
    my @matching = grep $uniq{$_}, @indi_numbers;
    print @matching ? ( ~~@matching, " matches : @matching " ) : "no matches ",
      "on line $.\n";
}

For example:

input data (infile)

16 6 21 4 45 13 30 
10 41 15 47 48 37 9 
19 16 5 33 29 14 8 
0 11 35 28 17 2 27 
39 17 39 22 12 48 23 
40 20 19 44 5 43 11

Output:

$ ./s infile
2 matches : 16 30 on line 1
1 matches : 9 on line 2
2 matches : 16 8 on line 3
2 matches : 35 11 on line 4
no matches on line 5
1 matches : 11 on line 6

Thanks man, that was exactly what i was trying to do! :slight_smile: