Damn I hate being publicly wrong, but you're right.
#!/usr/bin/perl -w
use strict;
my $a = 1;
foo($a);
print "$a\n";
sub foo {
$_[0] = 2;
}
prints '2'. It's shifting them off that list that creates the copy I am
used to working with.
But it still remains true that passing $dbh is safe, even if you shift it
off the list.
But I think we're officially off topic now.
____________________________
Jeff Seger
Fairchild Semiconductor
jeffrey.seger at fairchildsemi.com
____________________________
David <[EMAIL PROTECTED]>
01/10/2005 12:36 PM
To: Dbi-Users <[email protected]>
cc:
Subject: Re: passing dbh
On Mon, Jan 10, 2005 at 12:28:44PM -0500, [EMAIL PROTECTED]
wrote:
> I hate confusion, so I went to the source: perldoc perlsub, and here is
> what it had to say:
>
> The Perl model for function call and return values is simple: all
> functions are passed as parameters one single flat
> list of scalars, and all functions likewise return to their
caller
> one single flat list of scalars. Any arrays or
> hashes in these call and return lists will collapse, losing their
> identities--but you may always use pass-by-reference
> instead to avoid this.
>
> In other words, perl passes arguments by copy, not reference.
This is not correct. All the above says is that everything is passed as
a list. While the list is flat, it actually contains references to the
elements of the list.
For example:
sub f { $_[0] = 1; }
my $i = 0;
&f($i);
print("$i\n");
prints 1<new-line>.
You can avoid pass the effects of by reference by changing the
subroutine to work with copies:
sub f { my ($n) = @_; $n = 1; }
> In other words, yes, it is safe to just say "foo($dbh)" , but don't
start
> thinking that everytime you pass an argument to a subroutine that you
are
> passing a reference, because you are not unless you explicitly do so.
Passing arguments explicitly by reference is only useful is you want to
pass an array or hash as a single entity.
dd
--
David Dooling