符号表条目Test_two与A_Package::Test_one命名差异及正确性验证
符号表条目"Test_two"与"A_Package::Test_one"的差异
结合你给出的代码场景(代码位于Testing包的test_it子例程中),两者的核心差异如下:
归属的符号表不同
Test_two未指定包前缀,会被存入当前所在的Testing包的符号表,它的完整标识实际是Testing::Test_two。A_Package::Test_one明确携带包名前缀,直接存入**A_Package包的符号表**,与当前所处的Testing包无关联。
调用方式有区别
- 调用
Test_two时,在Testing包内部可直接写Test_two();在包外则需要使用Testing::Test_two(),或先通过use Testing;导入包后再调用。 - 无论在哪个包中,调用
A_Package::Test_one都必须使用完整的A_Package::Test_one()(前提是该符号表条目已存在)。
- 调用
符号表修改的作用域不同
- 对
Test_two的符号表赋值仅会修改Testing包的符号表,不会影响其他包的内容。 - 对
A_Package::Test_one的赋值是直接修改A_Package的符号表,不受当前所在包的限制。
- 对
关于你的理解验证
你的思路方向是正确的,但有一处细节需要修正:后者并非"相对于可执行文件符号表的绝对命名"——Perl中不存在"可执行文件符号表"的概念,所有符号表均以包为单位划分。带完整包名的标识符是直接定位到目标包的符号表条目,属于绝对命名;不带包名的则是相对当前包的命名,会自动补全当前包名。
内容的提问来源于stack exchange,提问作者user3158810
相关产品推荐
相关产品推荐

