如何检查perl模块是否可用?

时间:2015-09-16 12:23:02

标签: perl module namespaces packages

我找到了this

但是这对于在其他模块中定义的包不起作用,例如:

$cat mail.pl
{
package Hi::Test;
}    

my $rc =  eval{ require Hi::Test };

$rc在这里是假的。

我如何检查' Hi :: Test'可以吗?

4 个答案:

答案 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还会创建包FooFoo::Bar

答案 2 :(得分:1)

我对此有点生疏,但我认为你的require无论如何都会失败 - 这个错误:

#!/usr/bin/perl

{
    package Hi::Test;

    sub foo {
        print "bar\n";
    }
}

{
    package main;
    require Hi::Test; 
}

此错误 - 找不到@INC(因为它不在@INC中)。 userequire都明确指示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答案相比,它不会在全局存储中创建其他变量