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.
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
(Note: warnings are enabled, strictures disabled.)
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: <%-{-{-{-<
|