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

according to perl doc the keys() function will take a reference stored in a scalar, but it doesn't seem to work for me. I printed my reference to make sure it's really a reference but it still doesn't seem to work. Does keys() take a reference? If so I'll check my syntax.

$returns{'do_stuff'} = &do_stuff; my $ref99 = $returns{'do_stuff'}->[2] print keys($returns{'do_stuff'}->[2] ) , "\n"; print keys($ref99) , "\n"; sub do_stuff { my $ip = "198.18.0.210"; my $uname = "admin"; my $pass = "admin1"; my $cmd = "show chassis fpc pic-status | no-more"; my $ssh; my @output; my @out_lines; my @pics; my @fpcs; my %chassis; my $reachable; my $hostname = "mx480-0-re0"; my $err; my $exit; #doing stuff.... my @returns = (0 , "Success" , \%chassis , \@fpcs); return(\@returns); }

here's the Hash in question dumperer'd. It's actually a hash-of-arrays-of-hashes-of-arrays.

$VAR1 = 'do_stuff'; $VAR2 = [ 0, 'Success', { 'Slot 1' => [ 'PIC 0', 'PIC 1', 'PIC 2', 'PIC 3' ], 'Slot 0' => [ 'PIC 0', 'PIC 1', 'PIC 2', 'PIC 3' ] } ];

Replies are listed 'Best First'.
Re: How to keys($array_ref)?
by ikegami (Patriarch) on Sep 14, 2011 at 18:49 UTC

    according to perl doc the keys() function will take a reference stored in a scalar

    Since 5.14, yes. (And it has to be an unblessed reference.)

    Before that, it was a compile time error.

Re: How to keys($array_ref)?
by moritz (Cardinal) on Sep 14, 2011 at 17:43 UTC

    When you test the syntax of a perl expression, start off with simple cases:

    $ perl -wE 'say keys [1, 2]' 01 $ perl -wE 'say keys { a => 1, b => 2 }' ab

    So, works fine. Something seems to be off in your code, reducing it to a few essential lines probably shows the problem more clearly.

    It also generally helps if you're more specific than "doesn't seem to work" -- do you get an error message, or some wrong result? What do you expect, what do you get?

    Update: I removed some irrelevant parts from your code, and got an empty line, which makes sense since you haven't posted any code that initializes %chassis. When I add some initialization, it works as expected:

    $returns{'do_stuff'} = do_stuff(); print keys($returns{'do_stuff'}->[2] ) , "\n"; sub do_stuff { my %chassis = ( a => 1, b => 2 ); my @returns = (0 , "Success" , \%chassis); return(\@returns); } __END__ ab

    (Tested with perl 5.14.1).

      Figured it out. I was accidentally creating a second reference in the return array with

      my @returns = ["blah","blah","blah"]; return(\@returns);
      which should have been:
      my @returns = ("blah","blah","blah"); return(\@returns);
      so I ended up with a reference to a reference to the array I was trying to access instead of a reference to the data.

Re: How to keys($array_ref)?
by muba (Priest) on Sep 14, 2011 at 23:01 UTC

    On a side note, I feel I should mention that tthe title of your node is slightly confusing. You're trying to get the keys of a hashref (namely, a reference to hash called %chassis in do_stuff), not of an arrayref.

      sorry about that. I have been modifying this code too much and haven't cleaned up. At one point that variable actually was an array reference. I probably should have fixed it before I posted it online. Thanks all for the help though.