There's a distinction between %main:: (the symbol table of the main package, i.e., namespace) and the two hashes %main and %main::main (which are two different ways of naming the same hash!) in the main package.
(Note: warnings are enabled, strictures disabled.)c:\@Work\Perl\monks>perl -w -le "use v5.10; say X; say $main::{X}; if(exists $main::{X} ){ say 'A: exists';} else {say 'A: does not e +xist';} if(exists $main{X} ){ say 'B: exists';} else {say 'B: does not e +xist';} if(exists $main::main{X}){ say 'C: exists';} else {say 'C: does not e +xist';} die 'not the same' if \%main != \%main::main; die 'are the same' if \%main == \%main::; if( defined(X) ){say 'defined';} else {say 'not defined';} " say() on unopened filehandle X at -e line 1. *main::X A: exists B: does not exist C: does not exist defined
The statement say X; creates an unopened filehandle X in the main package which exists and is defined, although useless. The hash elements $main{X} and $main::main{X} (again, two different names for the same thing) do not exist and are not defined.
Update 1: A few minor wording changes.
Update 2: The difference and equivalence among the two separate hashes running around in this example code can be highlighted by inserting the
say ' \%main:: ', \%main::, ' \%main ', \%main, ' \%main::main ', \%main::main;
statement just before the two die statements. Note that autovivification is at work to bring the latter two hashes | hash with two names into existence.
Give a man a fish: <%-{-{-{-<
In reply to Re^5: Two meanings of undef (updated)
by AnomalousMonk
in thread Two meanings of undef
by likbez
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |