What happens if you try to dereference a value that is not a hard reference? The value is then treated as a symbolic reference. That is, the reference is interpreted as a string representing the name of a global variable.
Here is how this works:
$name = "bam"; $$name = 1; # Sets $bam $name->[0] = 4; # Sets the first element of @bam $name->{X} = "Y"; # Sets the X element of %bam to Y @$name = (); # Clears @bam keys %$name; # Yields the keys of %bam &$name; # Calls &bam
This is very powerful, and slightly dangerous, in that it's possible to intend (with the utmost sincerity) to use a hard reference, but to accidentally use a symbolic reference instead. To protect against that, you can say:
and then only hard references will be allowed for the rest of the enclosing block. An inner block may countermand the decree with:use strict 'refs';
It is also important to understand the difference between the following two lines of code:no strict 'refs';
Because the second form is quoted, it is treated as a symbolic reference and will generate an error if use strict 'refs' is in effect. Even if strict 'refs' is not in effect, it can only refer to a package variable. But the first form is identical to the unbracketed form, and will refer to even a lexically scoped variable if one is declared. The next example shows this (and the next section discusses it).${identifier}; # Same as $identifier. ${"identifier"}; # Also $identifier, but a symbolic reference.
Only package variables are accessible through symbolic references, because symbolic references always go through the package symbol table. Since lexical variables aren't in a package symbol table, they are therefore invisible to this mechanism. For example:
which prints:our $value = "global"; { my $value = "private"; print "Inside, mine is ${value}, "; print "but ours is ${'value'}.\n"; } print "Outside, ${value} is again ${'value'}.\n";
Inside, mine is private, but ours is global. Outside, global is again global.
Copyright © 2001 O'Reilly & Associates. All rights reserved.