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 | |
by Zaxo (Archbishop) on Mar 02, 2005 at 02:52 UTC | |
by fglock (Vicar) on Mar 02, 2005 at 03:37 UTC | |
by ambrus (Abbot) on Mar 02, 2005 at 10:07 UTC | |
by dragonchild (Archbishop) on Mar 02, 2005 at 13:34 UTC |