Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl模块从非';进口的_Perl_Import_Dependencies - Fatal编程技术网

perl模块从非';进口的

perl模块从非';进口的,perl,import,dependencies,Perl,Import,Dependencies,我今天震惊地发现,我的一个perl模块使用了另一个模块,但没有导入它 然而,当我意识到这从未引起任何问题时,我感到震惊 代码类似于: package This; # no import for OTHER !! sub new { ... implementation ... my $something = OTHER->new(@arguments); # no error! ... more implementation ... } 那么给出了什么呢?这个没

我今天震惊地发现,我的一个perl模块使用了另一个模块,但没有导入它

然而,当我意识到这从未引起任何问题时,我感到震惊

代码类似于:

package This;
# no import for OTHER !!

sub new {
    ... implementation ...
    my $something = OTHER->new(@arguments); # no error!
    ... more implementation ...
}
那么给出了什么呢?这个没有导入其他——这是我检查的第一件事

如果导入
的代码也导入
其他
其他
是否可用于


澄清问题:

  • X
    Y
    Z
    是模块
  • X中:
    使用Y
  • X中:
    使用Z
  • Y
    使用
    Z
Y是否可以访问
Z
中的函数和方法(反之亦然)?

您使用的术语“导入”有点误导

Y
是否可以访问
Z
,而无需导入它(反之亦然)

是的,差不多<代码>使用
将模块加载到当前脚本中;所有
use
d模块都加载到同一个脚本中,因此可以看到彼此(前提是它们的
use
d顺序正确)

但是真正的导入-模块实际导出的内容,因此它们被复制到
use
ing模块的命名空间中-将只被复制到
use
ing模块的命名空间中

例如,考虑这个Perl脚本:

use Time::HiRes 'time';

package Foo;

sub time1() { return time(); } # calls the built-in time() function
sub time2() { return Time::HiRes::time(); }


package main;

print Foo::time1(), "\n"; # prints (e.g.) 1323048440
print Foo::time2(), "\n"; # prints (e.g.) 1323048440.80571
print time(), "\n";       # prints (e.g.) 1323048440.8061
它使用
s
Time::HiRes
模块,并告诉它将
Time::HiRes::Time
导出到当前名称空间(主名称空间),覆盖内置的
Time
。(
Time::HiRes::Time
类似于
Time
,但它的分辨率为次秒;它会给出类似于
1323048440.80571
的东西,而不仅仅是
1323048440
),因此package
Foo
可以看到
Time::HiRes
,以及
Time::HiRes
内的任何东西,比如它的
Time
;但它必须通过显式编写
Time::HiRes::Time
来明确指定这一点

(注意:为了简单描述,我将上述内容作为一个脚本编写,但当
Foo.pm
中定义了
Foo
并使用
use Foo;
加载时,也会发生同样的事情)

您使用的术语“导入”有点误导

Y
是否可以访问
Z
,而无需导入它(反之亦然)

是的,差不多<代码>使用
将模块加载到当前脚本中;所有
use
d模块都加载到同一个脚本中,因此可以看到彼此(前提是它们的
use
d顺序正确)

但是真正的导入-模块实际导出的内容,因此它们被复制到
use
ing模块的命名空间中-将只被复制到
use
ing模块的命名空间中

例如,考虑这个Perl脚本:

use Time::HiRes 'time';

package Foo;

sub time1() { return time(); } # calls the built-in time() function
sub time2() { return Time::HiRes::time(); }


package main;

print Foo::time1(), "\n"; # prints (e.g.) 1323048440
print Foo::time2(), "\n"; # prints (e.g.) 1323048440.80571
print time(), "\n";       # prints (e.g.) 1323048440.8061
它使用
s
Time::HiRes
模块,并告诉它将
Time::HiRes::Time
导出到当前名称空间(主名称空间),覆盖内置的
Time
。(
Time::HiRes::Time
类似于
Time
,但它的分辨率为次秒;它会给出类似于
1323048440.80571
的东西,而不仅仅是
1323048440
),因此package
Foo
可以看到
Time::HiRes
,以及
Time::HiRes
内的任何东西,比如它的
Time
;但它必须通过显式编写
Time::HiRes::Time
来明确指定这一点


(注意:为了简单描述,我将上述内容作为一个脚本编写,但当
Foo.pm
中定义了
Foo
并使用
use Foo;
加载时,也会发生同样的情况)

是的,至少当您使用间接包和对象语法时是这样。从像这样的电话

OtherPackage->method()
$anOtherPackageObject->method()

Perl可以解析完全限定的子例程名称(
&OtherPackage::method
在上述两种情况下),并从任何地方调用该子例程。

是,至少在使用间接包和对象语法时是这样。从像这样的电话

OtherPackage->method()
$anOtherPackageObject->method()

Perl可以解析一个完全限定的子例程名称(
&OtherPackage::method
,在上述两种情况下),并从任何地方调用该子例程。

它正在导入到某个地方。我怀疑,如果你把这归结为一个问题,你会发现情况就是这样。@BrianRoach——只是为了给我澄清一下:如果X导入Y,X也导入Z,那么Y就可以访问Z而不导入它(反之亦然)?我相信是的,一旦导入包,它就可以在全球范围内使用,因为OO是以某种方式固定在perl上的,但我必须对它进行测试;我已经有好几年没有写太多perl了,它有点生疏了。它正被导入某个地方。我怀疑,如果你把这归结为一个问题,你会发现情况就是这样。@BrianRoach——只是为了给我澄清一下:如果X导入Y,X也导入Z,那么Y就可以访问Z而不导入它(反之亦然)?我相信是的,一旦导入包,它就可以在全球范围内使用,因为OO是以某种方式固定在perl上的,但我必须对它进行测试;我已经有好几年没有写太多perl了,它有点生疏了。感谢大家对
import
——我试图澄清一下这一点。我相信你答案的第一部分解决了我的具体问题。谢谢感谢您对导入的指导——我已经尝试澄清了操作。我相信您回答的第一部分解决了我的具体问题。谢谢