RE: Perl arrays and hashes

  • From: "Sina Bahram" <sbahram@xxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Mon, 13 Oct 2008 16:38:22 -0400

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

Other related posts: