Better to have anything that is that dangerous always be an error. Ask yourself: is it an error or isn't it?
This code is an error under strict 'refs':
foreach my $field (qw( foo bar baz)) {
*$field = sub {
my $self = shift;
$self->{$field} = shift if @_;
$self->{$field};
};
}
This is an incredibly great way to create accessors/mutators for an object in the simplist and most common case. It makes it easy to create new accessors/mutators, and is very memory-efficent (since there is actually only one subroutine in memory that handles many different cases).
OTOH, the following also won't work under strict 'refs':
use CGI qw(:all);
my @names = param();
foreach my $name (@names) {
$$name = param($name);
}
The fact that the above doesn't work under strict 'refs' is a good thing. It would allow any parameters passed to the CGI to clobber the values of existing scalars in the namespace. (This is based on a real example I saw in a SoPW a while back by a well-meaning but obviously inexperianced CGI programmer).
Thus, a new user should always use strict to catch potential errors, but an experianced coder will know when it's OK to shut it off.
---- I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
-- Schemer
:(){ :|:&};:
Note: All code is untested, unless otherwise stated
|