in reply to Populating A Hash

You would be helped by a code indentation convention. I've made some corrections and rigged it to pass strictures.

use warnings; use strict; my $file = pop @ARGV; chomp $file; my (@letters, @bin); # added open MESG, '+<' , $file or die $file, ' unavailable: ', $!; while (<MESG>) { # changed to read from the open handle my @characters = split //; push @letters, @characters; push @bin, map { my $c = unpack 'b*', $_ } @characters; # foreach my $letter (@letters) { # my ($ascii) = unpack ("C" ,$letter); # my ($bin) = unpack ("b*",$letter); # my $ordinal = ord $letter; # print "\n1)$letter\n"; # print "2)$ordinal\n"; # print "3)$ascii\n"; # print "4)$bin\n"; # # push is moved above # } } my %letnet; @letnet{@letters} = @bin; # slice replaces the double foreach while (my ($key,$value) = each (%letnet)) { print "$key-->$value\n"; }

Your doubly nested hash populating loop was wrong. For each letter, it churns through all the binary representations, assigning each in turn to the $letter key's value. Eventually each key gets the value $bin[-1]. I replaced it with the efficient hash slice mechanism.

Why do you use the '+<' signature in open? It is unnecessary to have the file open to write in what you show. If you later write to the file you should call flock after open.

After Compline,
Zaxo

Replies are listed 'Best First'.
Re^2: Populating A Hash
by dragonchild (Archbishop) on Mar 02, 2005 at 02:45 UTC
    If you later write to the file you should call flock after open.

    That doesn't resolve the race condition. Flock before open is the way to go.

    Being right, does not endow the right to be rude; politeness costs nothing.
    Being unknowing, is not the same as being stupid.
    Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
    Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

      Where do you get the filehandle to call flock by?

      After Compline,
      Zaxo

      No, flock after opening is correct I belive. You might be thinking of the common error of opening a file in ">" mode, which O_TRUNCates the file, thus changing it before you had a chance to flock it.

        I could have sworn that there was still a race condition if you open the file for reading, then the OS pre-empts you and hands control to a process that opens it for writing, writes a bunch, then you get handed back the file and attempt to flock it.

        I'm too tired to look it up right now, but I thought I read (years back) about a way to atomically open and lock the file descriptor at the same time. The Camel is only talking about sysopen(), which still requires a separate flock().

        Being right, does not endow the right to be rude; politeness costs nothing.
        Being unknowing, is not the same as being stupid.
        Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
        Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.