Tim Ayers wrote: > I am hoping someone will explain why the following program produces > the warning > > "my" variable $a masks earlier declaration in same scope > at /home/tayers/pkg.pl line 11. > > ----------------------- pkg.pl ---------------------------------- > #!/usr/bin/perl -w > package foo; > my $a = 'foo'; > sub foo { "foo::a=$a" } > package bar; > my $a = 'bar'; > sub bar { "bar::a=$a" } > package main; > print foo::foo(), " ", bar::bar(), "\n"; > ----------------------- pkg.pl ---------------------------------- > > The $foo::a and $bar::a variables are not available outside their > respective package as far as I can tell. I assume the compiler keeps > track of package switches. Why does it think I'm doing something > worrisome? i hope the following is right... you're not doing anything with $foo::a or $bar::a. these are package variables, while my()ed variables are lexical variables, not associated with a package (and not in the symbol table), but rather with a lexical section of code. lexical variables that are declared outside of a block have "file scope": scope from their declaration to the end of their file. thus, the second my($a) masks the earlier declaration. here's a shorter example: #!/usr/bin/perl -w package foo; my $a = 'foo'; package bar; print "\$a is $a\n"; my $a = 'bar'; print "\$a is $a\n"; -- Steve Lane <sml@zfx.com> ==== Want to unsubscribe from Fun With Perl? Well, if you insist... ==== Send email to <fwp-request@technofile.org> with message _body_ ==== unsubscribe