in reply to hash help

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

True laziness is hard work

Replies are listed 'Best First'.
Re^2: hash help
by bkish11 (Novice) on Jun 29, 2009 at 04:25 UTC

    I apperciate your help,if I want take all the entries (all file) how would do it

      Remove  or $1 ne 'rf1' from the test in the second while loop. If that doesn't do what you want then show us an example of the output you do want (assuming the original input data).


      True laziness is hard work