RE: Perl arrays and hashes

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

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

Other related posts: