Certainly I agree with what you said. Thanks for your comments ;-).
Probably, what I _really_ meant is doing something like
my ($in) = @_;
will initialize a new variable $in with the contents
of the first argument.. and if it's other than a reference
the cost of doing so may be high if the data to be thus 'copied'
is substantial.
I've done a bit more playing with Devel::Peek module which
allows one to look inside the Perl variables (look up their
guts sort of ;-):
#!/usr/local/bin/perl
use Devel::Peek 'Dump';
sub foo {
# this will create a new variable $s and copy first argument's con
+tents right?
my ($s) = @_;
print "Dump inside trim():\n";
print "\$_[0] (this one is infact a 'synonym' to the actual variab
+le; not it's copy :-) :\n";
Dump($_[0]);print"\n";
print "\$s (this is a copy of the 1-st argument:\n";
Dump($s);print"\n";
}
sub bar(\$) {
# this will create a new variable $s and copy first argument's con
+tents as well,
# however, it's much faster here compred to foo() since in this ca
+se only
# a reference to the actual variable is copied, not the actual var
+iable's
# contents.
my ($s) = @_;
print "Dump inside bar(\\\$):\n";
print "\$_[0]:\n";
Dump($_[0]);print"\n";
print "\$s (this is a copy of the 1-st argument, which is nothing
+more but a reference..):\n";
Dump($s);print"\n";
}
$s = "some text here ";
print "Dump before:\n";
Dump($s);print"\n";
foo($s);
bar($s);
print "Dump after:\n";
Dump($s);print"\n";
And here's the output produced by this script:
Dump before:
SV = PV(0xf0c44) at 0xfe99c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0xf7560 "some text here "\0
CUR = 15
LEN = 16
Dump inside trim():
$_[0] (this one is infact a 'synonym' to the actual variable; not it's
+ copy :-) :
SV = PV(0xf0c44) at 0xfe99c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0xf7560 "some text here "\0
CUR = 15
LEN = 16
$s (this is a copy of the 1-st argument:
SV = PV(0xf0c98) at 0xfe9c0
REFCNT = 1
FLAGS = (PADBUSY,PADMY,POK,pPOK)
PV = 0xf7540 "some text here "\0
CUR = 15
LEN = 16
Dump inside bar(\$):
$_[0]:
SV = RV(0x11581c) at 0xf096c
REFCNT = 1
FLAGS = (ROK)
RV = 0xfe99c
SV = PV(0xf0c44) at 0xfe99c
REFCNT = 3
FLAGS = (POK,pPOK)
PV = 0xf7560 "some text here "\0
CUR = 15
LEN = 16
$s (this is a copy of the 1-st argument, which is nothing more but a r
+eference..):
SV = RV(0x115828) at 0x1164b0
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
RV = 0xfe99c
SV = PV(0xf0c44) at 0xfe99c
REFCNT = 3
FLAGS = (POK,pPOK)
PV = 0xf7560 "some text here "\0
CUR = 15
LEN = 16
Dump after:
SV = PV(0xf0c44) at 0xfe99c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0xf7560 "some text here "\0
CUR = 15
LEN = 16
Certainly, the difference is subtle. And, also, '$_[0]' itself
is not a copy of the source variable, but rather it's 'synonym'
or reference (c-like). However, most of the time it's much
easier to simply pass around references just in case, at least
that's how me thinks ;-)...
"There is no system but GNU, and Linux is one of its kernels." -- Confession of Faith
|
|