> -----Original Message-----
> From: John W. Brooking IV [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, December 26, 2001 10:16 AM
> To: [EMAIL PROTECTED]
> Subject: Syntax problems with complex data structure
> 
> 
> 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.

The line above that one is missing the semicolon. Your example
works fine for me if I add the semicolon.

> 
>   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? 

The missing semicolon appears to be the entire problem.

To return a hashref from the sub, you would change

    return %returnData;

to

    return \%returnData;

Then in the main program, call it like this:

   my $tableDef = readfile();    # $tableDef is ref to hash

and access it like this:

   print "   $tableDef->{colDefs}[0]{name}\n";  # note "->" deref operator

> 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.

   # iterate through list of hashrefs
   for my $href (@{$tableDef->{colDefs}}) {
      print "$href->{name}\n";
   }

   # use an index
   for my $i (0 .. $#{$tableDef->{colDefs}}) {
      print "$tableDef->{colDefs}[$i]{name}\n";
   }

> 
>    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"

This line is missing a semicolon.

> print "   $tableDef{colDefs}[0]{name}\n";
> 
> 
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 

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

Reply via email to