Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Can't use string blah as an ARRAY ref

by kingram (Acolyte)
on Jul 30, 2012 at 07:32 UTC ( #984375=perlquestion: print w/replies, xml ) Need Help??
kingram has asked for the wisdom of the Perl Monks concerning the following question:

I get this error

Can't use string ("3") as an ARRAY ref while "strict refs" in use at ./ntt line 185 (#1)
    (F) Only hard references are allowed by "strict refs". Symbolic references are disallowed.
When I use this code in a sub:
sub test(){ print "\$#{\@_} = $#{@_}\n"; }
The data passed into the sub as presented by Dumper:
$VAR1 = 'insert into test (foo1, foo2, foo3, foo3, foo5, foo6) VALUES +(?,?,?,?,?,?) '; $VAR2 = 'datum1'; $VAR3 = 'datum2'; $VAR4 = 'datum3'; $VAR5 = 'datum4'; $VAR6 = 'datum5'; $VAR7 = 'datum6';
I do not understand the help message so I'm stuck
Would appreciate a little nudge of understanding here.
I did take a look at perlref, but I'm still stumped.

Replies are listed 'Best First'.
Re: Can't use string blah as an ARRAY ref
by tobyink (Abbot) on Jul 30, 2012 at 07:37 UTC

    Are you trying to get a count of how many items there are in @_?

    printf("There are %d args.\n", scalar(@_));

    If you are confused about the exact meaning of the error message, it's this...

    1. $#{ ... } can be used to get the last index of an arrayref. It expects the contents of the braces to be an arrayref - i.e. a scalar.
    2. Thus it imposes a "scalar context" when evaluating the contents of the braces.
    3. Thus in $#{@_}, a scalar context gets imposed on @_.

    4. When a scalar context is imposed on an array, it returns the number of items in the array.
    5. Thus you end up with: $#{ $some_number }, and Perl thinks you're trying to use some number as an arrayref.
    6. Numbers and strings are pretty much interchangeable, thus you get the error message about not being able to use a string as an arrayref.

    I think what you wanted was $#_.

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
Re: Can't use string blah as an ARRAY ref
by jwkrahn (Monsignor) on Jul 30, 2012 at 14:18 UTC

    You should also get an error message that says something like "Too many arguments for main::test ..." because you are using a prototype that says your subroutine will accept NO arguments!

    See also: FMTEYEWTK on Prototypes in Perl

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://984375]
Approved by tobyink
[Discipulus]: good morning monks

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (8)
As of 2017-01-17 08:06 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (152 votes). Check out past polls.