Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

error when passing hash as reference causes

by ccarden (Monk)
on Sep 11, 2003 at 21:29 UTC ( [id://290831]=perlquestion: print w/replies, xml ) Need Help??

ccarden has asked for the wisdom of the Perl Monks concerning the following question:

I tried my best to read copious threads on this site regarding the subject of passing hashes. To say the least, this subject has been hashed and rehashed (sorry).

I cannot seem to correctly pass hashes as references. I will need to do this in order to pass more than one hash or a hash along with other parms.

I keep getting errors along the likes of:

Not a CODE reference at ./hashTest.pl line 33.
or:
Can't use string ("me") as a HASH ref while "strict refs" in use ...
The code resembles most of the reference examples on this site. I get the errors on Linux and IRIX.
#!/usr/bin/perl -w use strict; my %hash = ( 's' => '1', 'e' => '200', 'b' => '1', 'me' => '0', 'mf' => '0', 'im' => '/usr/tmp/cache/ccarden/earth/images/earth', 'pad' => '4', 'yh' => '191', 'yl' => '0', 'of' => 'jpg', 'x' => '1024', 'y' => '768' ); sub print_h { my %new_hash = @_; foreach (keys %new_hash) { print " Key: $_,\t Value: $new_hash{$_}\n"; } } sub print_h_byref { my $href = shift; my ($value, $key); foreach $key (keys %$href) { $value = $href->($key); print " Key: $key,\t Value: $value\n"; } } print_h (%hash); print "\n"; print_h_byref (\%hash);
I don't know if anyone else will get the errors. Judging by the examples I've seen, I think not. But any elucidation and correction would be much appreciated. Thanks.

Replies are listed 'Best First'.
Re: error when passing hash as reference causes
by dmitri (Priest) on Sep 11, 2003 at 21:33 UTC
    This code:
    $value = $href->($key);
    should use curly braces (indicating that $hash is a reference to a hash), not parentheses (indicating that $hash is a reference to a function).

    The line in question tries to call a subroutine referenced by $hash, hence the error message.

Re: error when passing hash as reference causes
by NetWallah (Canon) on Sep 11, 2003 at 23:54 UTC
    You can also make your print_h_byref code a little easier to read by using the example from the documentation of the "each" function:
    sub print_h_byref { my $href = shift; while (my ($key, $value) = each %$href) { print " Key: $key,\t Value: $value\n"; } }
    Your print_h function makes a local copy of the hash. You should be aware that this may become an issue for large hashes, or if it is called a large number of times.
Re: error when passing hash as reference causes
by jdtoronto (Prior) on Sep 12, 2003 at 03:09 UTC
    This will work:
    #!/usr/bin/perl -w use strict; my %hash = ( 's' => '1', 'e' => '200', 'b' => '1', 'me' => '0', 'mf' => '0', 'im' => '/usr/tmp/cache/ccarden/earth/images/earth', 'pad' => '4', 'yh' => '191', 'yl' => '0', 'of' => 'jpg', 'x' => '1024', 'y' => '768' ); sub print_h { my %new_hash = @_; foreach (keys %new_hash) { print " Key: $_,\t Value: $new_hash{$_}\n"; } } sub print_h_byref { my $href = shift; while (my ($key, $value) = each %$href) { print " Key: $key,\t Value: $value\n"; } } print_h (%hash); print "\n"; print_h_byref (\%hash);
    Which is, I think, close to what somebody else suggested. You can tidy up that sub and also avoid the error you made :)

    jdtoronto

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://290831]
Approved by Paladin
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2024-04-19 06:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found