in reply to Hash Trouble

chop should be chomp.

"$3" should be $3.

"$msg" should be$msg.

"$val" should be $val.

Why are you using a substitution instead of if ($_ =~ /^(\D+.*\d{4}\s+)(\D+.*)(\w{11})$/?

$_ =~ can be omitted.

It's bad to use $1, $2, etc after calling a function after they've been set.

fmt_rpt($msg) should probably be $msg = fmt_rpt($msg).

And the answer to your question: $val .= "$msg"; should $analysis{$key} .= $msg. I'm not sure if that's exactly what you want, but you never save $val into the hash, so your problem is definitely here.

$val is used but never set in the else part of the if.

And the answer to your question: $val .= "$msg"; should $analysis{$key} .= $msg. I'm not sure if that's exactly what you want, but you never save $val into the hash, so your problem is definitely here.

$1 is never used. I'm going to leave the capture in the code below, in case you plan on using $1.

Fixed code:

while(<RPT>) { chomp; if (/^(\D+.*\d{4}\s+)(\D+.*)(\w{11})$/) { $key = $3; $msg = $2; # Maybe should be: $msg = fmt_rpt($msg); fmt_rpt($msg); if (exists($analysis{$key})) { $analysis{$key} .= $msg; } else { $analysis{$key} = $msg; } } else { print "Program Error 2\n"; exit 1; }

Replies are listed 'Best First'.
Re^2: Hash Trouble
by tc1364 (Beadle) on Nov 19, 2004 at 18:04 UTC
    Thank you for all of the information! The new code was missing the association of $val in the else statement so it was added and the new code looks like: $1 = time stamp $2 = error message $3 = unique identifer I am not sure if the time stamp information is going to be used.
    while(<RPT>) { chomp; if (/^(\D+.*\d{4}\s+)(\D+.*)(\w{11})$/) { $key = $3; $msg = $2; fmt_rpt($msg); if (exists($analysis{$key})) { $analysis{$key} .= $msg; } else { $val = $msg; $analysis{$key} = $val; } } else { print "Program Error 2\n"; exit 1; }
    For me I would rather build one hash table instead of multiple hash tables and then merging them. To me it seems like a waste what are your thoughts?
      The new code was missing the association of $val

      Not at all. There's no reason to do
      $val = $msg;
      $analysis{$key} = $val;
      when
      $analysis{$key} = $msg;
      suffices.

      For me I would rather build one hash table instead of multiple hash tables and then merging them. To me it seems like a waste what are your thoughts?

      To which multiple hashes are you refering? You mean if you if you were to keep the timestamp? You could do something like:

      while(<RPT>) { chomp; if (/^(\D+.*\d{4}\s+)(\D+.*)(\w{11})$/) { my $timestamp = $1; my $msg = $2; my $key = $3; fmt_rpt($msg); if (exists($analysis{$key})) { $analysis{$key}[1] .= $msg; } else { $analysis{$key} = [ $timestamp, $msg ]; } } else { print "Program Error 2\n"; exit 1; }

      See perllol for details. This would be a HoA (Hash of Arrays), which is similar to the mentioned AoA (Array of Arrays).

        You are right... my blunder. No what I meant about the Hash thing was someone building a hash table for each file. In my case there are multiple files so I would perfer looping through for example the log files from multiple days and make one hash table. This section of code will be used for analysis and once certain peg counts are reached, email the responsible part will the information. Thank you for all of your assistance and words of wisdom, Terry.