RE: Perl arrays and hashes

  • From: "Sina Bahram" <sbahram@xxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Tue, 14 Oct 2008 08:50:58 -0400

This is starting to get at what I was trying to say. If I set it equal to
[], then I won't need to do the @{$macs{$key}} but rather could do
@macs{$key}?

Take care,
Sina


-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Jim Dunleavy
Sent: Tuesday, October 14, 2008 4:43 AM
To: programmingblind@xxxxxxxxxxxxx
Subject: Re: Perl arrays and hashes

Hi Sina,

@macs{$key} = ();
has the effect of assigning undefined to that key position.
It's the same as writing:
$macs{$key} = ();
If you have "use strict" perl will warn you of that usage.
When you write:
$macs{$key}[$i++] = $mac;
Perl replaces the previously assigned undefined scalar value with a newly
created array reference, making the previous assignment redundant.
To create an empty array reference for the mac address use:
$macs{$key} = [];

HTH

--Jim

----- Original Message -----
From: Sina Bahram <sbahram@xxxxxxxxx>
To: <programmingblind@xxxxxxxxxxxxx>
Sent: Tuesday, October 14, 2008 7:00 AM
Subject: RE: Perl arrays and hashes


> I did understand all of that, but I suppose I was asking about why perl
was
> treating it as a reference rather than doing the conversion itself.
> Regardless though, it all works and thanks.
>
> Take care,
> Sina
>
> -----Original Message-----
> From: programmingblind-bounce@xxxxxxxxxxxxx
> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian
Rasnita
> Sent: Tuesday, October 14, 2008 1:35 AM
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: Perl arrays and hashes
>
> Hi,
>
> You need to write
>
> @{$macs{$key}}
>
> and not
>
> @macs{$key}
>
> because %macs is a hash and not an array to be noted with @ at the
> beginning.
>
> The %macs hash has a key named $key which happends to have an array as a
> value.
>
> So you first need to specify that you want to address the key $key of this
> hash, using
>
> $macs{$key}
>
> and derefference it to get its value... the array, using @{$macs{$key}}
>
> It is just like when you use
>
> my $hash_key = $macs{$key};
> my @array = @$macs_key;
>
> Of course, you need to add more braces like when you use
> my @array = @{$hash_key};
> because $macs{$key} already contains braces and you need to specify that
the
> entire $macs{$key} is an array reference, not only $hash.
>
> Octavian
>
> ----- Original Message -----
> From: "Sina Bahram" <sbahram@xxxxxxxxx>
> To: <programmingblind@xxxxxxxxxxxxx>
> Sent: Monday, October 13, 2008 11:38 PM
> Subject: RE: Perl arrays and hashes
>
>
> > I'm off to try this out, but can you please explain why that is?
> >
> > I do understand why you're doing what you're doing, but I'm unclear as
to
> > why perl isn't doing this automatically?
> >
> > Take care,
> > Sina
> >
> >
> > -----Original Message-----
> > From: programmingblind-bounce@xxxxxxxxxxxxx
> > [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian
> Rasnita
> > Sent: Monday, October 13, 2008 4:24 PM
> > To: programmingblind@xxxxxxxxxxxxx
> > Subject: Re: Perl arrays and hashes
> >
> > Hi,
> >
> > You need to use:
> >
> > for my $key (sort(keys(%macs)))
> > {
> > print "$key\n";
> > for my $val (@{$macs{$key}})
> > {
> > print "$val\n";
> > }
> > print "\n";
> > }
> >
> > Octavian
> >
> > ----- Original Message -----
> > From: "Sina Bahram" <sbahram@xxxxxxxxx>
> > To: <programmingblind@xxxxxxxxxxxxx>
> > Sent: Monday, October 13, 2008 10:50 PM
> > Subject: Perl arrays and hashes
> >
> >
> >> Hi all,
> >>
> >> I have a very simple program that loops through a file, whose structure
> is
> >> like this.
> >>
> >> Key name:
> >> Value1
> >> Value2
> >> Value3
> >> ...
> >>
> >> Key name:
> >> Value1
> >> Value2
> >> .....
> >>
> >> Key name:
> >> Value1
> >> Value2
> >> Value3
> >> Value4
> >> ...
> >>
> >> And so on
> >>
> >> Not hard, right?
> >>
> >> I use the following snippet of code to parse that file.
> >>
> >> ***
> >>
> >> open(MACS, "macs.txt");
> >>
> >> my @macsFromFile = <MACS>;
> >> chomp @macsFromFile;
> >>
> >> my %macs;
> >> my $i = 0;
> >> for my $mac (@macsFromFile)
> >> {
> >> if($mac =~ /10.110.0.*/)
> >> {
> >> $key = $mac;
> >> $i = 0;
> >> @macs{$key} = ();
> >> }
> >>
> >> $macs{$key}[$i++] = $mac if($mac =~ /05:.*/);
> >> }
> >>
> >> ***
> >>
> >> Anyways, as far as I can tell, that works fine. When I print out the
keys
>
> >> of
> >> that hash, I get all the ip addresses I was looking for, but heaven
> forbid
> >
> >> I
> >> try to get the values. That's an insane nightmare.
> >>
> >> How can I loop through that hash, with each key, looping through each
of
> >> the
> >> arrays stored at each key's index. After all, each key is an IP
address,
> >> and
> >> each IP address has a series of mac addresses associated with it in
this
> >> file, in the form of them being in an array assigned to that key in the
> >> hash.
> >>
> >> So I wanted to make sure I parsed the file write. Thus, why not just
> print
> >> it out again and compare against the original. I tried the following.
> >>
> >> ***
> >>
> >> for my $key (sort(keys(%macs)))
> >> {
> >> print "$key\n";
> >> for my $val (@macs{$key})
> >> {
> >> print "$val\n";
> >> }
> >> print "\n";
> >> }
> >>
> >> ***
> >>
> >> It prints out a single memory address rather than the list of the
> contents
> >> of that array.
> >>
> >> Why does it do this?
> >>
> >> I am using a for each construct to itterate through an array, and I use
> >> the
> >> @ to indicate that I want array context to be used when I parse
> >> @macs{$key}
> >> ... What the heck else should I do to make perl understand I want to
loop
> >> through the array stored at @macs{$key}?
> >>
> >> Maybe I'm not doing this right up top? That's what I think the problem
> is.
> >> Somehow I've given my hash a reference to an array, rather than the
array
> >> itself.
> >>
> >> Help!
> >>
> >> Take care,
> >> Sina
> >>
> >> __________
> >> View the list's information and change your settings at
> >> //www.freelists.org/list/programmingblind
> >>
> >
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> >
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> >
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>

----------------------------------------------------------------------------
"Information in this email (including attachments) is confidential.  
It is intended for receipt and consideration only by the intended recipient.
If you are not an addressee or intended recipient, any use, dissemination,
distribution, disclosure, publication or copying of information contained in
this email is strictly prohibited.  Opinions expressed in this email may be
personal to the author and are not necessarily the opinions of the HSE.

If this email has been received by you in error we would be grateful if you 
could immediately notify the ICT Service Desk by telephone at +353 1 6352757

or by email to service.desk@xxxxxxxxxxxx and thereafter delete this
e-mail from your system"
----------------------------------------------------------------------------
__________
View the list's information and change your settings at 
//www.freelists.org/list/programmingblind

__________
View the list's information and change your settings at 
//www.freelists.org/list/programmingblind

Other related posts: