G'day jorba,
Either the code you posted is not what you ran or you haven't shown us the complete output.
I created "pm_1201774_moose_demo.pm", which I'm going to modify in stages,
as I show the output when testing, and make fixes.
To start with, here's a very minimal version to show an error you should have seen:
package Demo;
use Moose;
has test => (is => 'rw', isa => 'ArrayRef');
sub check {
$self->test(());
}
As Moose automatically turns on
the strict pragma:
$ perl -c pm_1201774_moose_demo.pm
Global symbol "$self" requires explicit package name (did you forget t
+o declare "my $self"?) at pm_1201774_moose_demo.pm line 8.
pm_1201774_moose_demo.pm had compilation errors.
Changing &check to declare $self:
sub check {
my ($self) = @_;
$self->test(());
}
That problem is now fixed:
$ perl -c pm_1201774_moose_demo.pm
pm_1201774_moose_demo.pm syntax OK
Now I add code to emulate your error.
package Demo;
use Moose;
has test => (is => 'rw', isa => 'ArrayRef');
sub check {
my ($self) = @_;
$self->test(());
$self->test()->[0] = 'X';
}
package main;
Demo::->new->check;
Note the syntax is still fine; your error occurs at runtime.
$ perl -c pm_1201774_moose_demo.pm
pm_1201774_moose_demo.pm syntax OK
$ perl pm_1201774_moose_demo.pm
Can't use an undefined value as an ARRAY reference at pm_1201774_moose
+_demo.pm line 12.
In "$self->test(());", your argument is an empty list which will flatten to nothing;
i.e. it's the same as "$self->test();".
This is an accessor; I believe you want a mutator
(I'm guessing this would be to reinitialise that attribute).
In order for that method to act as a mutator,
you need to pass a value of an appropriate type (in this case: isa => 'ArrayRef'), such as:
$self->test([]);
Now the syntax is still OK and the runtime error no longer occurs.
$ perl -c pm_1201774_moose_demo.pm
pm_1201774_moose_demo.pm syntax OK
$ perl pm_1201774_moose_demo.pm
$
Compare that with your problem two days ago:
... Fields ... isa => 'HashRef' ...
$self->Fields({});
And, if that Fields() method is intended to be the same as the one in your current code:
$Cnt = scalar $self->Fields;
I suspect you're going to have a problem with that also.
Here's a hint:
$ perl -E 'my $x = {a=>1,b=>2}; say scalar $x; say scalar keys %$x'
HASH(0x7ffe120040b0)
2
And looking at the two lines after that:
$self->FieldCount = $Cnt;
$self->Changed = -1;
You're going to get the same errors that you had in your last question.
Frankly, they seem unrelated to your current issue and I don't why you posted them;
however, if these haven't changed:
... FieldCount ... isa => 'Num' ...
... Changed ... isa => 'Boolean' ...
You'll end up with repeats of:
... Can't modify non-lvalue subroutine call at ...
Furthermore, using "-1" as a boolean value is likely to be highly confusing (and, therefore, error-prone).
It's also probably just wrong, as a "SELECT" statement is a read-only operation.
I'd expect the value of "Changed" to be false, but:
$ perl -E 'my $x = -1; say $x ? "true" : "false"'
true
|