Eric at Lucii.org on 20 Jan 2011 12:37:46 -0800


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] perl question


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 01/20/2011 03:01 PM, Walt Mankowski wrote:
> On Thu, Jan 20, 2011 at 02:44:37PM -0500, Eric at Lucii.org wrote:
>> I have a data structure in perl:
>>
>> @output
>>
>> It is sparse (not all indexes have values.)
>>
>> Those that do look like this example which would be something like $output[5]:
>> $VAR1 = {
>>           '128' => {
>>                      'salutation' => 'Dr.',
>>                      'area' => '800',
>>                      'spec_link' => '131',
>>                      'state' => 'PA',
>>                      'last_name' => 'Smith',
>>                      'dr_id' => '1',
>>                      'city' => 'Swarthmore',
>>                      'middle' => 'A',
>>                      'active' => undef,
>>                      'phone' => '555-1212',
>>                      'description' => 'some description goes here',
>>                      'sex' => 'M',
>>                      'address2' => '',
>>                      'loc_no' => '1',
>>                      'zip' => '19067',
>>                      'title' => 'DMD',
>>                      'address1' => '123 Any Street.',
>>                      'first_name' => 'John'
>>                    }
>>         };
>>
>> When I put data in the element I do it like this:
>>
>>    $var1 = 5 ; $var2 = 128 ;
>>    $output[$var1]->{$var2}->{'description'} = "some description goes here" ;
>>
>> To get the data out I walk through the array, skipping indexes where there is no
>> data.  Once I find an array element with data I want to access the elements.
>> Currently, the only way I can get to it is to use Dumper to produce the above
>> print out.
>>
>> How do I find out what the {'128'} value is so that I can address the elements?
>>
>> I tried this:
>>
>> for ( $x = 0; $x < $#output; $x++ ) {
>>     next if not defined $output[$x] ;
>>     $hashKey = keys $output[$x]  ;
>>     print "record: $x has last name of: "
>>        . $output[$x]->{$hashKey}->{'last_name'}  ;
>> }
>>
>> ... but perl barfs on the use of keys
>> Type of arg 1 to keys must be hash (not array element) at ./build_fast_doc.pl
>> line 229, near "]  ;"
>>
>> What am I missing here?  I thought the array elements here ARE hashes.
> 
> No, the array elements are hash references, not hashes themselves.  So
> you have to dereference it like so:
> 
> keys %{$output[$x]}
> 
> But your code would still have a problem, because keys returns a list,
> not a scalar.  So if you wanted to save all the keys you'd need to do
> something like
> 
> my @hashKeys = keys %{$output[$x]};
> 
> Oh, and your for loop has a bug as well.  If you have an array @a,
> then $#a is the index of the last element in the array.  Since you
> have < instead of <=, you're going to miss the final element.  You
> hardly ever need to use C-style for loops in Perl, especially when
> you're going through one element at a time.  I'd probably write the
> loop as
> 
> for my $x (0..$#output)
> 
> Walt

Ah! so that was my problem.

Now, I use:

  @hashKeys = keys %{$output[$x]} ;

... and then just always use $hashKeys[0] to get what I want

Thanks
Eric
- -- 
#  Eric Lucas
#
#                "Oh, I have slipped the surly bond of earth
#                 And danced the skies on laughter-silvered wings...
#                                        -- John Gillespie Magee Jr
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk04nQQACgkQ2sGpvXQrZ/7yYQCg4jtwbNapV9Dy1LWxsvx+N5kF
27cAoKNnA9ycE6TG2zmkenbSJMSJ66b9
=jrps
-----END PGP SIGNATURE-----
___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug