Why is the "ARRAY Not Important" error?

I have this script

#!/usr/bin/perl use strict; use warnings; use yy; my $data = [ ["aax", "ert", "ddd"], ["asx", "eer", "kkk"], ["xkk", "fff", "lll"], ["xxj", "vtt", "lle"], ]; use Test::More tests => 4; is(yy::type1_to_type2(\$data, 'aax'), 'ert'); is(yy::type1_to_type3(\$data, 'asx'), 'kkk'); is(yy::type2_to_type3(\$data, 'fff'), 'lll'); is(yy::type3_to_type1(\$data, 'lle'), 'xxj'); 

which uses this module

 package yy; sub typeX_to_typeY { my ($x, $y, $data, $str) = @_; foreach (@$data) { if ($_->[$x - 1] eq $str) { return $_->[$y - 1]; } } return; } sub type1_to_type2 { typeX_to_typeY(1, 2, @_) } sub type1_to_type3 { typeX_to_typeY(1, 3, @_) } sub type2_to_type1 { typeX_to_typeY(2, 1, @_) } sub type2_to_type3 { typeX_to_typeY(2, 3, @_) } sub type3_to_type1 { typeX_to_typeY(3, 1, @_) } sub type3_to_type2 { typeX_to_typeY(3, 2, @_) } 1; 

and gives this error

 Not an ARRAY reference at yy.pm line 6. # Looks like your test died before it could output anything. 

The line he complains about is

 foreach (@$data) { 

Isn't this a way to pass an array reference?

What am I doing wrong?

+6
arrays perl
source share
2 answers

You create a link to the link, since $data already an array reference - firstly, it is a scalar, and secondly, you used square brackets to initialize your value. So, change your calls to use $data , not \$data .

+14
source share

$data = [] is an array reference. Using \$data , you create a link to a scalar.
Change the code:

 is(yy::type1_to_type2($data, 'aax'), 'ert'); ... 
+7
source share

All Articles