First off a few general coding tips:
Always use the three parameter version of open, always check the result and always lexical file handles. Taking all that into account an open statement becomes:
open my $file1In, '<', $file1 or die "Failed to open $file1: $!";
Always use strictures (use strict; use warnings;). if (($pr1{$key1} = $sil{$key._ref1}) ... may be a copy error, but it is wrong on two counts. Perl's numeric equality operator is == (assignment within an if expression is a really bad idea btw), and you actually want a string compare, not a numeric compare, so you should be using eq.
Something like the following may be what you want:
use strict; use warnings; my $file1 = <<END_FILE1; Bbbb,3333,4444 Cdd,3444,3444 Zddd,345,456 END_FILE1 my $file2 = <<END_FILE2; Bbbb_rf1,23,45 Cdd_rf2,24.45 Zddd,34,456.4 END_FILE2 my %concat; open my $file1In, '<', \$file1 or die "Failed to open file1: $!"; while (<$file1In>) { chomp; my ($key, @tail) = split ','; next if ! @tail; $concat{$key} = \@tail; } close $file1In; open my $file2In, '<', \$file2 or die "Failed to open file2: $!"; while (<$file2In>) { chomp; my ($key, @tail) = split ','; next if ! @tail or $key !~ s/_(\w*)$// or $1 ne 'rf1'; push @{$concat{$key}}, @tail; print join (',', $key, @{$concat{$key}}), "\n"; } close $file2In;
Prints:
Bbbb,3333,4444,23,45
In reply to Re: hash help
by GrandFather
in thread hash help
by bkish11
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |