Jan Eden wrote:
>
> the following structure does not work as intended:
>
> sub read_index {
>
> my $gedicht_path = shift;
> my (%author_indexlines, %author_headlines, %gedicht_lines, @author_letters,
> @gedicht_letters, @alphabet_index);
> find (\&read_poem, $gedicht_path);
> print %author_indexlines; # nothing is printed out here!
> return \(%author_indexlines, %author_headlines, %gedicht_lines, @author_letters,
> @gedicht_letters, @alphabet_index);
> }
>
>
> sub read_poem {
>
> # scalars to read from the poem page
> my ($vorname, $nachname, $title, $namekey, $titlesort_string, $nameletter,
> $titleletter, $page, $relative_path);
>
> my $pathname = $File::Find::name;
> return 0 unless $pathname =~ /\.html$/;
>
> # definition of the file path relative to the $gedicht_path
> $relative_path = $pathname;
> $relative_path =~ s#$gedicht_path/##; # Perl complains about uninitialized value
> here
> [filling the hashes and arrays declared above]
> print %author_indexlines; # the hash is printed correctly here
> }
>
> I expect the variable $gedicht_path to be accessible inside the read_poem
> subroutine, since it is called from within read_index, it is not (I get an
> 'uninitialized value' error).
>
> Second, I expect the hashes and arrays in declared in read_index to be filled
> in read_poem. read_poem does not complain about undeclared variables, and I
> can print the appropriate %author_indexlines etc. from within read_poem, but
> not from read_index, as intended.
>
> Can anyone point me to the (probably obvious) problem with the locally scoped
> variables?
Hi Jan.
Lexical ('my') variables are accessible only within the innermost block or
file in which they are declared. As the body of a subroutine is a block
things like your $gedicht_path are accessible only within &read_index.
You need to declare the list of hashes and arrays /before/ and /outside/
any subroutine that needs them. Like this:
my (%author_indexlines, %author_headlines, ... );
sub read_index {
:
}
sub read_poem {
:
}
Also, think carefully about whether you need so much common data. I would
expect to see the sort of thing you're using contained within a single hash.
Without knowing more about what you're doing I can't help any further.
HTH,
Rob
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>