RE: Perl arrays and hashes

  • From: "Sina Bahram" <sbahram@xxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Tue, 14 Oct 2008 15:51:03 -0400

Indeed, no disagreements from me on that example.

Thanks much for the discussion.

Take care,
Sina
 

-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian Rasnita
Sent: Tuesday, October 14, 2008 3:38 PM
To: programmingblind@xxxxxxxxxxxxx
Subject: Re: Perl arrays and hashes

Well, and then how could you be able to get a list of values from a hash?

For example, maybe you have a hash like:

my %colors = (
white => '#ffffff',
black => '#000000',
red => '#ff0000',
green => '#00ff00',
blue => '#0000ff',
);

And you want to get the array of values for the keys red, green and blue.

You should use exactly the syntax you want to use for something else:

my @values = @colors{('blue', 'red', 'green')};

Or if you want to put in @values the value for only white, you need to use:
my @values = @colors{white};

And in this last case, the array @values will contain a single element, the 
value of the key "white".

As a tip, when somebody needs to gets the values in an array this way, he 
doesn't usually create a common quoted list of keys, but uses the qw() 
function to create a list like:

my @values = @colors{qw(blue green red)};

or more usually uses / as a delimiter and not params, like:

my @values = @colors{qw/blue green red/};

When you have a multidimensional data structure like a hash of arrays, it is

very normal to need specifying each level of the structure.

Octavian

----- Original Message ----- 
From: "Sina Bahram" <sbahram@xxxxxxxxx>
To: <programmingblind@xxxxxxxxxxxxx>
Sent: Tuesday, October 14, 2008 9:06 PM
Subject: RE: Perl arrays and hashes


> But it should not do that. If I use { and }, it should immediatley realize
> I'm speaking of a hash, and the @ sign should let it know I'm wanting to
> dereference an array out of it.
>
> Take care,
> Sina
>
>
> -----Original Message-----
> From: programmingblind-bounce@xxxxxxxxxxxxx
> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian 
> Rasnita
> Sent: Tuesday, October 14, 2008 1:40 PM
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: Perl arrays and hashes
>
> If you use
>
> @colors{greys}
>
> perl thinks that you have an array named @colors, and if it is followed by
> {...} it understands that you want to get the array of values for the
> specified keys.
>
>
> Octavian
>
> ----- Original Message ----- 
> From: "Sina Bahram" <sbahram@xxxxxxxxx>
> To: <programmingblind@xxxxxxxxxxxxx>
> Sent: Tuesday, October 14, 2008 5:04 PM
> Subject: RE: Perl arrays and hashes
>
>
>> But I wasn't assigning it to a key, only to the value stored at that 
>> key's
>> index.
>>
>> For example.
>>
>>
>> If I have %colors
>>
>>
>> I would like to have
>>
>> @colors{darks}
>> @colors{lights}
>> @colors{greys}
>>
>> Where those are simply arrays, as I tried to symbolize by the at sign,
>> which
>> contain a list of colors of the given description.
>>
>> Instead, I'm lead to believe that I would have to do.
>>
>>
>> @{$colors{"darks"}}
>>
>> Which is fine, but I'm just saying I think the previous syntax looks
>> nicer.
>>
>> Take care,
>> Sina
>>
>> -----Original Message-----
>> From: programmingblind-bounce@xxxxxxxxxxxxx
>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of
>> james.homme@xxxxxxxxxxxx
>> Sent: Tuesday, October 14, 2008 9:29 AM
>> To: programmingblind@xxxxxxxxxxxxx
>> Subject: RE: Perl arrays and hashes
>>
>> Hi,
>> Perhaps I didn't read correctly, but I thought he said that you couldn't
>> assign an array to a key of a hash, but you can assign an array to a 
>> value
>> of a hash. I think this is like a Python or VbScript or JavaScript
>> dictionary.
>>
>> Thanks.
>>
>> Jim
>>
>> James D Homme, Usability Engineering, Highmark Inc.,
>> james.homme@xxxxxxxxxxxx, 412-544-1810
>>
>> "The difference between those who get what they wish for and those who
>> don't is action. Therefore, every action you take is a complete
>> success,regardless of the results." -- Jerrold Mundis
>> Highmark internal only: For usability and accessibility:
>> http://highwire.highmark.com/sites/iwov/hwt093/
>>
>>
>>
>>             "Sina Bahram"
>>             <sbahram@xxxxxxxx
>>             m>                                                         To
>>             Sent by:                  programmingblind@xxxxxxxxxxxxx
>>             programmingblind-                                          cc
>>             bounce@freelists.
>>             org                                                   Subject
>>                                       RE: Perl arrays and hashes
>>
>>             10/14/2008 08:50
>>             AM
>>
>>
>>             Please respond to
>>             programmingblind@
>>               freelists.org
>>
>>
>>
>>
>>
>>
>> Thanks much. Is there a reason why you can not assign an array, rather
>> than
>> an array reference, to an element of a hash?
>>
>> Take care,
>> Sina
>>
>> -----Original Message-----
>> From: programmingblind-bounce@xxxxxxxxxxxxx
>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian
>> Rasnita
>> Sent: Tuesday, October 14, 2008 7:13 AM
>> To: programmingblind@xxxxxxxxxxxxx
>> Subject: Re: Perl arrays and hashes
>>
>> This is because for any hash key you can have an array reference as a
>> value.
>> You can't have an array as a value for a hash key.
>>
>> For example, you can't use something like:
>>
>> %hash = (
>> key => (1, 2, 3),
>> );
>>
>> but you need to use:
>>
>> %hash = (
>> key => [1, 2, 3],
>> );
>>
>> And when you use $hash{key} you will have the value of this key as a
>> result.
>> And that value is an array ref, not an array.
>>
>> If you want to have the array for that ref, you need to dereference it,
>> putting the "@" sign before it like:
>>
>> my $arrayref = [1, 2, 3];
>> my @array = @$arrayref;
>>
>> So you need to use @$arrayref and not only @arrayref because there is no
>> an
>> array with this name.
>>
>> $arrayref is a scalar not an array. That scalar is a reference to an
>> array.
>>
>>
>>
>> Octavian
>>
>> ----- Original Message -----
>> From: "Sina Bahram" <sbahram@xxxxxxxxx>
>> To: <programmingblind@xxxxxxxxxxxxx>
>> Sent: Tuesday, October 14, 2008 9: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
>>>
>> __________
>> 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
>
> __________
> 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: