snakespan
snakespan

Reputation: 1211

NOT an array reference error in Perl

I'm getting an error in Perl and I can't work out why.

Error: Not an ARRAY reference at Service.pm, line 20

my $array = [ { name => 'George', surname => 'Marley' } ];
my $helper = CustMessage->new();
$helper = CustMessage->getMessage($array);

then in my utility file I have:

sub getMessage {
    my ($self, $args) = @_;
    my $stringsArray = shift;

    my $strings = Service->new({
        serviceId => $self->_serviceId(),
    });

    return unless $strings;

    $strings->getStrings($stringsArray);
}

and then in the Service method is:

sub getStrings {
    my ($stringsArray, $self) = shift;
    my @keys = map({ $_->{'name'} } @{$stringsArray});
    my $key = join('', @keys); 
    $key = MIME::Base64::encode($key);

    my %results;
    $results{$key} = $self->_callStrings->($stringsArray);
    $results{$key}->initialize();

    $results{$key} = $self->{serviceCalls}->{getStrings};
    return $self->{serviceCalls}->{getStrings};
}

The error is on line 2 of the getStrings method in Service.pm:

my @keys = map({ $_->{'name'} } @{$stringsArray});

Upvotes: 1

Views: 1074

Answers (2)

mpapec
mpapec

Reputation: 50647

RE: I'm getting an error in Perl and I can't work out why. Error: Not an ARRAY reference at Service.pm, line 20

Try

my ($self, $stringsArray) = @_;

instead of

my ($stringsArray, $self) = shift; 
# $self is always undef here due one element list assignment

since getStrings() is object method and object instance is always first element in @_ array.

Upvotes: 1

Borodin
Borodin

Reputation: 126722

The lines

my $helper = CustMessage->new();
$helper = CustMessage->getMessage($array);

are very odd. You are creating a new CustMessage object in $helper and immediately discarding it and overwriting it with the result of

CustMessage->getMessage($array);

which, apart from any inheritance that may be going on, is identical to

getMessage('CustMessage', $array);

and I am suspecting that you don't have a real class defined as you call it your "utility file"

Because getMessage receives its arguments like this

my ($self, $args) = @_;
my $stringsArray = shift;

you are left with

($self, $args) = ('CustMessage', $array)
$stringsArray  = 'CustMessage'

and you never use $args again so your array reference is lost.

I cannot be sure what it is you actually want, because, as I said, I suspect that you don't have a proper CustMessage.pm file. But you could try

my $helper = CustMessage->new;
my $message = $helper->getMessage($array);

and then

sub getMessage {
    my ($self, $stringsArray) = @_;

    ...
}

Upvotes: 2

Related Questions