in reply to how to push multiples row of values into hash and do comparison

#!/usr/bin/perl # https://perlmonks.org/?node_id=1224208 use strict; use warnings; use Data::Dump 'dd'; my $file1 = <<END; name foo num 111 222 333 444 name jack num 999 111 222 333 num 333 444 555 777 END my $file2 = <<END; name jack num 999 111 222 333 num 333 444 555 777 name foo num 666 222 333 444 END my %hash1 = gethash($file1); my %hash2 = gethash($file2); #dd 'file1', \%hash1, 'file2', \%hash2; print "\t\tFile1\t\t\t\t\tFile2\n"; print "Name\tX1\tY1\tX2\tY2\t\tX1\tY1\tX2\tY2\n"; for my $key ( keys %hash1 ) { my $name = $key; for ( match( $hash1{$key}, $hash2{$key} ) ) { print "$name\t$_\t\t$_\n"; $name = ''; } } sub match { my ($one, $two) = @_; my @same; for my $item (@$one) { push @same, grep $item eq $_, @$two; } return @same; } sub gethash { local $_ = shift; s/^\s+//gm; s/[ \t]+/\t/g; my %hash; while( /^name\s+(\S+)\n(num.*\n)*/gm ) { my $name = $1; $hash{$name} = [ $& =~ /^num\s*(.*)/gm ]; } return %hash; }

Outputs :

File1 File2 Name X1 Y1 X2 Y2 X1 Y1 X2 + Y2 jack 999 111 222 333 999 111 222 + 333 333 444 555 777 333 444 555 + 777

Replies are listed 'Best First'.
Re^2: how to push multiples row of values into hash and do comparison
by darkmoon (Novice) on Oct 22, 2018 at 07:34 UTC

    Thanks you for your response. I tried your code and it is awesome! However , I cannot get the output after i tried to modify your code. i want to get the input by using the $ARGV method.

    #!/usr/bin/perl use strict; use warnings; use Data::Dump 'dd'; my $input1=$ARGV[0]; my $input2=$ARGV[1]; open my $fh1, '<', $input1 or die "Cannot open file : $!\n"; my %hash1 = gethash($fh1); close $fh1; open my $fh2,'<',$input2 or die "Cannot open file : $!\n"; my %hash2 = gethash($fh2); close $fh2; dd 'file1', \%hash1, 'file2', \%hash2; print "\t\tFile1\t\t\t\t\tFile2\n"; print "Name\tX1\tY1\tX2\tY2\t\tX1\tY1\tX2\tY2\n"; for my $key ( keys %hash1 ) { my $name = $key; for ( match( $hash1{$key}, $hash2{$key} ) ) { print "$name\t$_\t\t$_\n"; $name = ''; } } sub match { my ($one, $two) = @_; my @same; for my $item (@$one) { push @same, grep $item eq $_, @$two; } return @same; } sub gethash { local $_ = shift; s/^\s+//gm; s/[\t]+/\t/g; my %hash; while(/^name\s+(\S+)\n(num.*\n)*/gm ) { my $name = $1; $hash{$name} = [$& =~ /^num\s*(.*)/gm ]; } return %hash; }

    Any idea ?

      It would help to actually read the file data (untested change)

      sub gethash { my $fh = shift; local $/; local $_ = <$fh>; s/^\s+//gm; s/[\t]+/\t/g; my %hash; while(/^name\s+(\S+)\n(num.*\n)*/gm ) { my $name = $1; $hash{$name} = [$& =~ /^num\s*(.*)/gm ]; } return %hash; }