in reply to Re: Should "use strict" complain if I use a variable that is not declared?
in thread Should "use strict" complain if I use a variable that is not declared?

As previously mentioned, using a variable that was conditionally defined is not valid Perl, but the compiler does not flag it as an error. I shall suggest alternatives.

The problem can be eliminated from

sub new { my $class = shift; my %self = %{$_[0]} if ref $_[0]; ... }

by writing it as

# Class->new(); # Class->new({ k=>v, ... }); sub new { my $class = shift; my %self = ref $_[0] ? %{$_[0]} : (); ...

Better yet, allow the curlies to be omitted for free.

# Class->new(); # Class->new({ k=>v, ... }); # Class->new( k=>v, ... ); sub new { my $class = shift; my %self = ref $_[0] ? %{$_[0]} : @_; ... }

I always found using the curlies around named args silly. Sounds like a premature optimisation that does little more than make the code noisier.

There's also the following which doesn't allow hash refs at all:

# Class->new(); # Class->new( k=>v, ... ); sub new { my ($class, %self) = @_; ... }