Walt Mankowski on 20 Jan 2011 12:01:14 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] perl question |
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
Attachment:
signature.asc
Description: Digital 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