Readers,

  I hope you all have had or are having happy holidays of your tradition.

  I'm trying to build up a complex data structure from a file, and cannot
figure out the right syntax for accessing it afterwards. O'Reilly's
"Programming Perl" has been very helpful in showing me how to build it, but
I'm having trouble translating from its examples to mine in terms of
accessing it afterwards, especially after I get it back from the function
that builds it. I suspect my confusion may have something to do with
references.

  My data structure is a hash with two key/value pairs. The first value is
another hash, and the second is an array of hashes. The following function
is an abbreviated sample of the code that builds it. (In the real code, I
read values from a CSV file, but I've left that out of this example program
for the sake of clarity.) I have put some print statements inside the
function to show that the assignments seem to be working, and the syntax
works fine there. The function returns the plain hash (not a reference, but
maybe it should be?), and the $tableDef{table}{name} syntax is working fine
outside the function, but the $tableDef{colDef}[0]{name} syntax only works
inside the function.

  So when I run this code as is, I get (line 48 is the last line)

     syntax error at test3.pl line 48, near "print"
     Execution of test3.pl aborted due to compilation errors.

  If I comment that line out, I get:

     $returnData{colDefs}[0]{name} = "Category"
     $returnData{colDefs}[1]{name} = "Label"
     $returnData{colDefs}[2]{name} = "URL"
     $returnData{colDefs}[3]{name} = "Description"

     Table Links: Links to other sites
     Columns (explicitly)

   So why does the same syntax that works inside the function not work
outside it? Should I be returning a reference to the hash instead of the
hash itself? (Which would definately change the syntax anyway.) In either
case, what syntax will work outside the function? I would like to know how
to loop through the array using a foreach loop setting the loop variable to
be each hash in the array, as well using a for loop with the numeric array
index as the loop variable or just accessing the array elements by literal
number.

   In case it makes a difference, I'm using ActiveState Perl 5.6.1, binary
build 626.

   Thanks in advance for any advice.

- John Brooking
Portland, Maine

------ 8< --- begin code sample --- >8 -----

sub readfile{
   my %returnData;

   # Create the table hash element
   $returnData{table} = { name => "Links"
                        , desc => "Links to other sites"
                        };

   # Now create the array of column definitions
   my @fields;
   push @fields, { name =>          "Category"
                 , desc =>          "Which category of links?"
                 , type =>          "reference"
                 , presentation =>  ""
                 };
   push @fields, { name =>          "Label"
                 , desc =>          "What should this link be called?"
                 , type =>          "character"
                 , presentation =>  "length:25"
                 };
   push @fields, { name =>          "URL"
                 , desc =>          "Web address"
                 , type =>          "character"
                 , presentation =>  "length:50"
                 };
   push @fields, { name =>          "Description"
                 , desc =>          "A short description of this site"
                 , type =>          "character"
                 , presentation =>  "length:2:30"
                 };
   $returnData{colDefs} = [@fields];

   # Test the values
   print '$returnData{colDefs}[0]{name} = "' .
"$returnData{colDefs}[0]{name}\"\n";
   print '$returnData{colDefs}[1]{name} = "' .
"$returnData{colDefs}[1]{name}\"\n";
   print '$returnData{colDefs}[2]{name} = "' .
"$returnData{colDefs}[2]{name}\"\n";
   print '$returnData{colDefs}[3]{name} = "' .
"$returnData{colDefs}[3]{name}\"\n";
   print "\n";

   # Return the big hash
   return %returnData;

} # sub readfile

my %tableDef = readfile();
print "Table $tableDef{table}{name}: $tableDef{table}{desc}\n";
print "Columns (explicitly)\n"
print "   $tableDef{colDefs}[0]{name}\n";


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to