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

Hi dear monks. i wrote following subroutine

sub versatility{ my(%site1)=@_; my(%site2)=@_; for (keys(%site1)) { if ($site2{$_}) { my $m=(@{$site1{$_}}[1]-@{$site2{$_}}[1]); my $n=(@{$site1{$_}}[0]-@{$site2{$_}}[0]); my $slope=$m/$n; print "velocity= $slope\n"; } } }

but i have problem that says :cant use string [0,1] as an ARRAY refrence.i gave refrence as you see,but i dont know the reason for this error.please help me.

Replies are listed 'Best First'.
Re: hash references
by moritz (Cardinal) on Aug 01, 2011 at 11:33 UTC
    i gave refrence as you see

    No, we don't see, because you don't show how that sub is called.

    Why do you persistently ignore the advise from previous threads to actually read perlreftut and start to learn how references work in Perl?

    Also I don't see any hash references which you mention in the post title. There's no reason for two separate hashes that hold the same information.

      thanks.i know that when we want put an array for a key we have to reference to that for calling it back.but when i change to following code it is still not working and i have error.

      my $m=(${@{$site1{$_}}}[1]-${@{$site2{$_}}}[1]); my $n=(${@{$site1{$_}}}[0]-${@{$site2{$_}}}[0]);

      now,

       @{$site1{$_}}

      is a reference,isnt it?

        No, @{$site1{$_}} is a "normal" array. Hopefully $site1{$_} is a reference to an array, otherwise you are in trouble (either you have "use strict" then this will give an error, without it you might get no error but it still won't work as you intent

        What you probably want is something like $site1{$_}->[1]. This will access array index 1 of the array pointed to by $site{$_}

Re: hash references
by JavaFan (Canon) on Aug 01, 2011 at 11:58 UTC
    Considering that %site1 and %site2 are the same, why not replace the subroutine by a much simpler
    sub foo {1/0} # Triggers Illegal division by zero

      Well, it would actually be:

      sub foo {0/0}

      But I am totally with you on this... there is something badly wrong with how he is unpacking the vars into the subroutine!

        Unless there's some overloaded constant in effect, there's no difference beteen 0/0 and 1/0. Or 1238/0.