Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re: Perl hash keys not considered unique (updated)

by haukex (Bishop)
on Apr 23, 2018 at 13:19 UTC ( #1213427=note: print w/replies, xml ) Need Help??

in reply to Perl hash keys not considered unique

Welcome to the Monastery, elfstones65. In the future, please provide a Short, Self-Contained, Correct Example so that we can download and run the code and more easily see the issue that you are having.

Anyway, I assume that when reading your input, you first encounter a line that matches your first regex /File .../, and sets $files{"$processingFile"} = 1;, so e.g. $files{"ENV.FILESOURCE.SOURCE.J2018058.N000001"} = 1;. Then, when your code encounters a line matching /Finished/ for the same file, you attempt to use $files{"ENV.FILESOURCE.SOURCE.J2018058.N000001"} as a hash reference by saying things like $files{"$currentFile"}{'read'}. However, $files{"ENV.FILESOURCE.SOURCE.J2018058.N000001"} contains the value 1 instead of a hash reference.

Now Perl does something interesting: because you're not using strict 'refs', it will actually access a hash named %1 - and it will do this for all files that have the same value in the %files hash! So every file's /Finished/ data is ending up in the same hash, overwriting each other. You can see this yourself if you say use Data::Dumper; print Dumper(\%1); - you will see the data from the most recent Finished line collected in that hash. See Symbolic references.

The best solution here is to Use strict and warnings! This will force you to avoid symbolic references, which is a good practice because it avoids the confusing behavior you're seeing. See also Why it's stupid to `use a variable as a variable name'.

Update: Several edits to improve the explanation.

Replies are listed 'Best First'.
Re^2: Perl hash keys not considered unique (updated)
by elfstones65 (Novice) on Apr 23, 2018 at 14:30 UTC

    You hit the nail on the head. Trying to have the hash with shall I say multiple levels was the cause.

     $files{"$processingFile"} = 1

    Simply changing it to

     $files{"$processingFile"}{"file"} = $processingFile;

    Such a minor mistake, I was going nuts!

    Much appreciated.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1213427]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2020-11-30 08:49 GMT
Find Nodes?
    Voting Booth?

    No recent polls found