> > From: Graeme McLaren [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, March 08, 2006 3:57 PM
> > To: beginners@perl.org
> > Subject: counting scalar array elements question
> >
> > Hi all, I have an array question:
> >
> > If I have a variable, $var, and it contains an array how would I be able
> > to
> > easily count the number of elements in the array?  I've tried creating a
> > new
> > array and pushing the original array on to it but that creates an array
> > of
> > arrays.
> >
> > Basically I have:

use strict;
use warnings;

> > my $var = [
> >                  'a',
> >                  'b',
> >                  'c'
> >                ]

# shorter: 

my $var=[ qw/ a b c / ];

> > and I tried:

my @array;
#or:
my @array=();

(sidenote: the second form must be used in contexts where the code is 
persistent/preloaded and used several times, to ensure that @array is always 
empty when the next execution hits the code again. Of course only *if* it 
should start empty and not accumulate between executions)

> > push @array, $var;
> >
> >
> > and got:
> >
> > @array=[
> >                 [
> >                    'a',
> >                    'b',
> >                    'c'
> >                 ]
> >           ]

You probably got this AoA (array of arrays) by using 

use Data::Dumper;
Dumper [EMAIL PROTECTED];

The outer [] stems from the \ after Dumper.

The data structure of @array itself is only, formulated as list:
@array=( ['a','b','c'] )

An arrayref is a scalar (holding a reference to an array), so after pushing it 
to an empty array, you just get an array with one element, the pushed scalar.

> > Using my original array which is assigned to scaler, what I need is:
> >
> > @array = [
> >                 'a',
> >                 'b',
> >                 'c'
> > ]
> >
> >
> > So I can do:
> >
> > my [EMAIL PROTECTED];
> >
> >
> > Can anyone shed any light on this or suggest a better way of doing this?
>
>Timothy Johnson am Donnerstag, 9. März 2006 01.06:
> You need to dereference your array ref.
>
> my $count = @{$var};

the same, shorter, but more hiding what's going on:

my [EMAIL PROTECTED];

> Or in some circumstances it might make more sense to explicitly use
> scalar context:
>
> my $count = scalar @{$var};

One of these circumstances would be for example, since print provides list 
context:

print scalar @$var;

Hans

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to