NOTE: In C++ there are cases where the calling code can "reach into"
the function via the returned pointer or reference.
This is appearantly not true of passed back scalars. Check out this code:
$GlobalName = "Clinton";
sub getGlobalName
{
return($GlobalName);
}
print "Before: " . &getGlobalName() . "\n";
$ref = \&getGlobalName();
$$ref = "Gore";
print "After: " . &getGlobalName() . "\n";
#All print statements printed "Clinton"
I have been unable to hack into a subroutine via its scalar return.
If you know of a way it can be done, please let me know, as this would be a horrid violation of encapsulation.
####
$$ref = "Gore";
####
$ref = \&getGlobalName();
####
$GlobalName = "Clinton";
sub getGlobalName
{
return($GlobalName);
}
print "Before: " . &getGlobalName() . "\n";
$ref = \&getGlobalName();
print '>>', $$ref, "\n"; # Added
$$ref = "Gore";
print '>>', $$ref, "\n"; # Added
print "After: " . &getGlobalName() . "\n";
# Produces the output
Before: Clinton
>>Clinton
>>Gore
After: Clinton
####
$GlobalName = "Clinton";
sub getGlobalName {
return($GlobalName);
}
sub getRefToGlobalName {
return \$GlobalName;
}
print "Before: " . getGlobalName() . "\n";
$ref = getRefToGlobalName();
$$ref = "Gore";
print "After: " . getGlobalName() . "\n";
#prints
Before: Clinton
After: Gore
####
$GlobalName = "Clinton";
sub getRefToGlobalName {
return \$GlobalName;
}
print "Before: " . ${ getRefToGlobalName() } . "\n";
$ref = getRefToGlobalName();
$$ref = "Gore";
print "After: " . ${ getRefToGlobalName() } . "\n";
# Also prints
Before: Clinton
After: Gore
####
$GlobalName = "Clinton";
sub getRefToGlobalName {
return \$GlobalName;
}
$ref = getRefToGlobalName();
print "Before: " . $$ref . "\n";
$$ref = "Gore";
print "After: " . $$ref . "\n";
# Also prints
Before: Clinton
After: Gore