perl模块从非';进口的
我今天震惊地发现,我的一个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 ... } 那么给出了什么呢?这个没
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
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
它使用sTime::HiRes
模块,并告诉它将Time::HiRes::Time
导出到当前名称空间(主名称空间),覆盖内置的Time
。(Time::HiRes::Time
类似于Time
,但它的分辨率为次秒;它会给出类似于1323048440.80571
的东西,而不仅仅是1323048440
),因此packageFoo
可以看到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
它使用sTime::HiRes
模块,并告诉它将Time::HiRes::Time
导出到当前名称空间(主名称空间),覆盖内置的Time
。(Time::HiRes::Time
类似于Time
,但它的分辨率为次秒;它会给出类似于1323048440.80571
的东西,而不仅仅是1323048440
),因此packageFoo
可以看到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
——我试图澄清一下这一点。我相信你答案的第一部分解决了我的具体问题。谢谢感谢您对导入的指导——我已经尝试澄清了操作。我相信您回答的第一部分解决了我的具体问题。谢谢