http://qs321.pair.com?node_id=1004917

wannymahoots has asked for the wisdom of the Perl Monks concerning the following question:

I'm attempting to define a method that will calculate the length of an array stored within an object, but am running up against an issue. In the example given below, when I call scaler on the deferenced array (which I would hope would return the array length?), the call behaves as if I'd attempted to call a method of the class called "scaler"? Clearly I'm misunderstanding something fundamental here and would really appreciate any clarification...
{ package Test; our $AUTOLOAD; sub new { my ($class) = @_; return bless {arr => [1,2,3,4]}, $class; } sub len { my ($self) = @_; scaler(@{$self->arr}); } sub DESTROY {} sub AUTOLOAD { my ($self) = @_; (my $f = $AUTOLOAD) =~ s/.+://; print "function \"$f\" called\n"; $self->{$f}; } } my $tmp = Test->new; print $tmp->len,"\n";
Output:
function "arr" called function "scaler" called Can't use string ("1") as a HASH ref while "strict refs" in use at ./t +est.pl line 25.

Replies are listed 'Best First'.
Re: Method to calculate array length
by toolic (Bishop) on Nov 21, 2012 at 13:40 UTC
    Also, you can get more help from B::Lint
    perl -MO=Lint code.pl Nonexistant subroutine 'Test::scaler' called at code.pl z syntax OK

    and perlcritic

    perlcritic -1 code.pl Subroutine "scaler" is neither declared nor explicitly imported at lin +e 12, column 9. This might be a major bug. (Severity: 4)
Re: Method to calculate array length (scalar is scalar)
by Anonymous Monk on Nov 21, 2012 at 13:30 UTC

    scalar is scalar not scaler -- singulat, not climber

    haha, singular

      Amazing. For once, it is spelling and not coding that has let me down.
        Just a note: In this particular case, you could have found out that it was a spelling problem, since your AUTOLOAD was triggered. Of course this is not so clearly to see than having getting a "function not defined" error message. Partially for this reason, I refrain from using AUTOLOAD, unless I have very compelling reason to use it.

        -- 
        Ronald Fischer <ynnor@mm.st>