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
In reply to Re: Populating A Hash
by Zaxo
in thread Populating A Hash
by dReKurCe
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |