Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

printing hash produce errors

by Xfiles (Initiate)
on Jun 02, 2013 at 12:06 UTC ( #1036580=perlquestion: print w/replies, xml ) Need Help??
Xfiles has asked for the wisdom of the Perl Monks concerning the following question:

I am trying to execute the following line of code :
#!usr/bin/perl use strict ; use warnings ; my %hash = {'perl' => 1 , 'C' => 0} ; foreach my $key(sort keys %hash) { print "$key : $hash{$key} \n" ; }
but it gives me the following error :
Reference found where even-sized list expected at perl.pl line 9. Use of uninitialized value $hash{"HASH(0x98bf7ec)"} in concatenation ( +.) or string at perl.pl line 12. HASH(0x98bf7ec) :
so what is exactly the problem ?

Replies are listed 'Best First'.
Re: printing hash produce errors
by bart (Canon) on Jun 02, 2013 at 12:18 UTC
    Your problem is that you're mixing up hashes (%hash) with hash references ({ key => value }) -- note the braces.

    Replace the braces with parens and it should work:

    my %hash = ('perl' => 1 , 'C' => 0) ;
    This produces a flat list, not a hashref, which is exactly what assignment to a hash wants.

    Alternatively you could use a hashref (= a scalar pointing to a hash) everywhere:

    my $hash = {'perl' => 1 , 'C' => 0} ; foreach my $key(sort keys %$hash) { print "$key : $hash->{$key} \n" ; }
      that's it , thanks .

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1036580]
Approved by bart
help
Chatterbox?
[Corion]: But maybe there is some other Unicode string that will be true but have a zero width
[hippo]: For explanation, I've seen this construct in someone else's code (no names, no pack drill) and couldn't think of a situation to trigger it.
[Corion]: You'll have to look somewhere esoteric for that. Maybe some tied variable or special dualvar can also trigger that. But it's certainly not a common occurrence
[Corion]: And on 5.20, the following also outputs no find:perl -wle 'for my $x ("\x{2000}".."\ x{1fffff}") { if( $x && ! length $x ) { warn qq(<$x>); warn length $x; die } }'
[Corion]: (this time on Unix)
[hippo]: Understood. I'll have to go through the code and see if it's doing anything fancy with ties, dual-vars or non-scalars. In the end, it's probably a bug though.
[Corion]: Aaah - you should be able to do this with overload, but I would hit somebody really hard if they constructed objects that are true but the empty string, and you not knowing about the domain knowledge where this makes sense

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (14)
As of 2017-07-27 13:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I came, I saw, I ...
























    Results (413 votes). Check out past polls.