packageの不思議を解く
通常、package宣言された中のサブルーチンを呼び出すには、package名でサブルーチン名を修飾します。
なので、サンプルのケース1では、修飾していないのでワーニング(Unquoted string "baz" may clash with future reserved word)がでます。
しかし、サンプルのケース2では、修飾していなくてもワーニングにならないのです。不思議です。
実は、すべてのパッケージ名は『main::』に含まれるということなのです。
つまり、『Foo』は『main::Foo』とイコールで、『::Foo』も『main::Foo』とイコールなのです。
また、『main::main::main』は、main自身をいくら修飾しても同じリファレンスなので『main』とイコールなのです。
尚、『Hoge::Hoge::Hoge』がワーニングになるのは、『main::Hoge::Hoge::Hoge』となり『Hoge』とは別名前空間になるからです。
ということで、ケース2では、package名で修飾しなくてもワーニングにならないのです。
第3版ラクダ本の340ページあたりに書いてありました。
サンプル
#ケース1 package Baz; sub baz { print "baz\n"; } package Baz::; baz; # package名で修飾されていないのでワーニング Baz::baz; # package名で修飾されているのでOK package Hoge::Hoge::Hoge; sub hoge { print "hoge\n"; } package Hoge; hoge; # package名で修飾されていないのでワーニング Hoge::Hoge::Hoge::hoge; # package名で修飾されているのでOK #ケース2 package Foo; sub foo { print "foo\n"; } package ::Foo; foo; # package名で修飾されていなくてもワーニングが出ない package main::main::main; sub main { print "main\n"; } package main; main; # package名で修飾されていなくてもワーニングが出ない