http://www.perlmonks.org?node_id=1003200

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

Here is a short program that shows that I can get to an array stored in a hash. But how do I find out the length of said array?
# the program my %hash; my @arr; %hash = ( 'one' => [1], 'two' => [2,2], 'three' => [3,3,3], ); print "$hash{one}[0]\n"; print "$hash{two}[0]\n"; print "$hash{three}[0]\n"; $size = length $hash{one}; print ("size=$size\n"); $size = length $hash{two}; print ("size=$size\n"); print "all done\n"; % perl arrays.pl 1 2 3 size=16 size=16 all done

Replies are listed 'Best First'.
Re: length or array in a hash
by SuicideJunkie (Vicar) on Nov 09, 2012 at 19:46 UTC

    You're printing the length of a string that goes something like "ARRAY(0xDEADBEEF)"

    You need to dereference the arrayref: my $itemCount = @{ $hash{three} };  my $lastIndex = $#{ $hash{three}  }

Re: length or array in a hash
by brap (Pilgrim) on Nov 09, 2012 at 19:45 UTC

    Hi ongaku,

    perldoc -f length says that length isn't the right thing to use to find the number of elements in the array (I am assuming here that you're looking for the number of elements in the array). I think something along the lines of scalar @{$hash{one}} might be what you're looking for.

Re: length or array in a hash
by 2teez (Vicar) on Nov 09, 2012 at 19:54 UTC

    Hi, ongaku,
    You can do like so:

    %hash = ( 'one' => [1], 'two' => [2,2], 'three' => [3,3,3], ); foreach my $array (keys %hash){ print $array," :", scalar @{$hash{$array}},$/; }
    Output
    three :3 one :1 two :2
    You might want to check the function scalar

    If you tell me, I'll forget.
    If you show me, I'll remember.
    if you involve me, I'll understand.
    --- Author unknown to me
Re: length or array in a hash
by Cristoforo (Curate) on Nov 09, 2012 at 19:57 UTC
    Your answer is here. Just look for the (second) listed type of variable, arrays.

    Here is the bit you want to see (about arrays in scalar context).

    You might be tempted to use $#array + 1 to tell you how many items there are in an array. Don't bother. As it happens, using @array where Perl expects to find a scalar value ("in scalar context") will give you the number of elements in the array: 1. if (@animals < 5) { ... }
    Here is your program using those features.
    #!/usr/bin/perl use strict; use warnings; # the program my %hash = ( 'one' => [1], 'two' => [2,2], 'three' => [3,3,3], ); print "$hash{one}[0]\n"; print "$hash{two}[0]\n"; print "$hash{three}[0]\n"; while (my ($key, $aref) = each %hash) { # dereference array_reference # (and the @$aref array is in scalar context) printf "key=%s size=%d\n", $key, @$aref; }
    Prints:
    1 2 3 key=three size=3 key=one size=1 key=two size=2
      #!/usr/bin/perl + + use strict; use warnings; my %hash = ( one => [1], two => [ 2, 2 ], three => [ 3, 3, 3 ], ); for ( sort { $hash{$a} <=> $hash{$b} } keys %hash ) { print qq($_\t) . scalar( @{ $hash{$_} } ) . qq(\n); } print qq(\nVariatio delectat.\n);

      Regards, Karl

      «The Crux of the Biscuit is the Apostrophe»

        Thanks to all who replied and helped me out.