A less frequently seen error, but nevertheless an annoying one. It usually stems from incorrect use of an Object Oriented module.
In our example we used the excellent DateTime module to create a string representing the Year, Month, and Day. The module has a method called ymd
that will return the date in YYYY-MM-DD format.
However this is a method of a DateTime object and not the DateTime class.
So when someone write the following code and runs it:
examples/datetime_ymd_incorrectly.pl
use 5.010;
use strict;
use warnings;
use DateTime;
say DateTime->ymd;
we get:
Can't use string ("DateTime") as a HASH ref while "strict refs" in use at .../DateTime.pm line 682.
Unfortunately it looks as if the error was in the DateTime module (line 682) while the actual problem was the way we called it.
The correct way to use this is by first creating a DateTime object with one of the constructors. e.g. using now
and then calling ymd
on the object representing the current time:
examples/datetime_ymd_correctly.pl
use 5.010;
use strict;
use warnings;
use DateTime;
my $d = DateTime->now();
say $d->ymd;
2017-08-11
Can't use string (...) as an HASH ref while "strict refs" in use at ...
So what is this error message?
As you might know strict has 3 parts. This error was triggered by the part called
strict refs
that disables Symbolic references. Which is a good thing.
The error manifested itself inside the DateTime module where we had code that effectively did something like this:
examples/datetime_ymd_error.pl
use 5.010;
use strict;
use warnings;
my $self = 'DateTime';
say $self->{date};
In which we are trying to use the content of $self
which is DateTime
in our case, as a reference to a HASH.
Some people might blame strict
for the error and try to turn it off, but that will just bring us a silent error that
will bite us later.