【问题标题】:When accessing modules访问模块时
【发布时间】:2011-05-24 04:44:54
【问题描述】:

我有一个关于包、模块和语法的问题。当您访问同一个文件中的包时,我注意到您会使用类似....

package test;
$testVar="This is a test";

#and to access it using..

package main;
print($test::testVar);

或者干脆……

package test;
print($testVar);

然而,当我将此语法用于模块时,发送参数时,我应该从 print 函数的开头省略 $,但上面我没有。我注意到它不起作用,我不知道为什么。我的材料没有说清楚。

require module;
print(package::sub("argument"));

这是为什么呢?我很困惑。

【问题讨论】:

    标签: perl module packages


    【解决方案1】:

    这里的美元符号是一个符号,表示命名变量是一个标量。

    如果前面没有package 声明,则$var_name 的使用包含main 的隐含命名空间,即它是$main::var_name 的缩写。在您的示例中,首先有package main;,您需要规定命名空间是test,而不是main,因此需要$test::testVar

    对于函数调用,您不需要使用印记。如果你这样做了,你会使用 & 号 (&),但是在调用函数时使用 & 号已经不再受到许多程序员的青睐。*

    和以前一样,sub_name()main::sub_name() 的缩短版本...同样,调用package::sub() 不需要印记。

    *关于&使用的参考:

    【讨论】:

    • 与号不会以任何方式、形状或形式被弃用。有些人只是不喜欢它们,而且它们通常是不必要的,使用 & 而不使用 () 会创建一种通常不打算使用的特殊子调用。最后一点有时被用作反对使用 & 一般的论据,但我觉得它没有说服力。
    • @ysth 公平评论。我已经改写并添加了一些链接来扩展这一点。
    • 第一个链接中的 tye 链接是一个很好的总结:perlmonks.org/?node_id=29139
    • $var_name 中的默认命名空间不是main,而是无论当前包是什么。 main 只是您在出现 package 声明之前启动的包。
    • 您可能明白这一点,但您的回答暗示$var_name 总是 表示$main::var_name,这是不正确的。不太了解包的人可能会感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多