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

Dear monks,

In a program I've got two subroutines, one of these initializes a reference to a DB connection, the other wants to use this reference through a parameter hash.

I thought someting like this would work:
my %parameterhash; my $hashref = \%parameterhash; a($hashref); b($hashref); sub a{ my $hash_ref = @_; my $dbconnection= makeDBconnection(); my $handle = \$dbconnection; connect($handle); $hash_ref->{dbhandle} = $handle; } sub b{ my $hash_ref = @_; my $hand = $hash_ref->{dbhandle}; connect($hand); }
The first connect works fine, the second fails with error message:
Use of uninitialized value in connect at line ##

I started playing with (de)referencing but I don't find what's wrong. Any help would be appreciated

Replies are listed 'Best First'.
Re: passing (hash)refs through subroutines
by wfsp (Abbot) on Nov 03, 2009 at 10:58 UTC
    With regards the question in the title, in both subs you need either
    my ($hash_ref) = @_;
    or
    my $hash_ref = shift;
    @_ is an array.

    Update
    Just to note your snippet doesn't compile

    Not enough arguments for connect at C:\perm\dev\monk.pl line 15, near +"$handle)"
    connect is a perl function and after changing the name to my_connect we then get
    Can't use string ("1") as a HASH ref while "strict refs" in use at C:\ +perm\dev\monk.pl line 16.
    Line 16 is in sub a so for me the first connect doesn't work fine (because I'm using strict and warnings). What the error is telling you is that my $hash_ref = @_; sees the array in scalar context and returns the length of the array i.e. 1.

    This compiles and runs but obviously I don't know what your connect() or makeDBconnection() does.

    #!/usr/bin/perl use warnings; use strict; my %parameterhash; my $hashref = \%parameterhash; a($hashref); b($hashref); sub a{ my $hash_ref = shift; my $dbconnection= makeDBconnection(); my $handle = \$dbconnection; my_connect($handle); # line 15 $hash_ref->{dbhandle} = $handle; # line 16 } sub b{ my $hash_ref = shift; my $hand = $hash_ref->{dbhandle}; my_connect($hand); } sub my_connect { } sub makeDBconnection{ }