我找到了this
但是这对于在其他模块中定义的包不起作用,例如:
$cat mail.pl
{
package Hi::Test;
}
my $rc = eval{ require Hi::Test };
$rc
在这里是假的。
我如何检查' Hi :: Test'可以吗?
答案 0 :(得分:3)
我假设该包中确实发生了一些事情,而不仅仅是一个空块。
以下代码检查该包的符号表中是否有任何条目。它很脏,但只要注册了subs或package变量就可以工作。
{
package Hi::Test;
sub foo;
}
my $rc = eval{ require Hi::Test };
if (! $rc) {
$rc = do {
no strict;
*stash = *{"Hi::Test::"};
scalar keys %stash;
}
}
print $rc;
它会打印1
。
答案 1 :(得分:2)
您需要类似defined(*Hi::Test::)
的内容,只需提及*Hi::Test::
即可创建包。
$ perl -E'
say defined(*Hi::Test::) ? "exists" : "doesn'\''t exist";
'
exists
通过使用符号引用,可以避免这个问题。
$ perl -E'
{ package Hi::Test }
say defined(*{"Hi::Test::"}) ? "exists" : "doesn'\''t exist";
say defined(*{"Hi::TEST::"}) ? "exists" : "doesn'\''t exist";
'
exists
doesn't exist
将该代码放入子中以使事情变得更清洁。
$ perl -E'
use strict;
use warnings;
sub test_for_package {
my ($pkg_name) = @_;
$pkg_name .= "::";
return defined(*$pkg_name);
}
{ package Hi::Test }
say test_for_package("Hi::Test") ? "exists" : "doesn'\''t exist";
say test_for_package("Hi::TEST") ? "exists" : "doesn'\''t exist";
'
exists
doesn't exist
请注意,创建包Foo::Bar::Baz
还会创建包Foo
和Foo::Bar
。
答案 2 :(得分:1)
我对此有点生疏,但我认为你的require
无论如何都会失败 - 这个错误:
#!/usr/bin/perl
{
package Hi::Test;
sub foo {
print "bar\n";
}
}
{
package main;
require Hi::Test;
}
此错误 - 找不到@INC
(因为它不在@INC
中)。 use
和require
都明确指示perl
“出去找模块文件”
但你仍然可以用'
来调用'foo'Hi::Test::foo();
因此,您无法使用eval
测试模块的加载,也无法检查%INC
。
但你可以做的是检查%Hi::
:
use Data::Dumper;
print Dumper \%Hi::;
print Dumper \%Hi::Test::;
这给了我们:
$VAR1 = {
'Test::' => *{'Hi::Test::'}
};
$VAR1 = {
'foo' => *Hi::Test::foo
};
所以我们可以:
print "Is loaded" if defined $Hi::{'Test::'}
答案 3 :(得分:0)
<强>已更新强>
我找到了这个线索:
my $module = *main::;
my @sub_name = split '::', $full_name;
while( each @sub_name ) {
$module = $$module{ $sub_name[$_].'::' };
}
print "Module is available" if $module;
与this答案相比,它不会在全局存储中创建其他变量