为什么我的Perl脚本不使用我的模块?

时间:2012-03-15 18:36:15

标签: perl perl-module subroutine

module.pm

package module;
use 5.012;
use warnings;

sub Parse
{
   return 1;
}

1;

script.pl

#!/usr/bin/perl -w

use 5.012;
use warnings;
use lib 'C:/';
use module;

print Parse("value");

标准输出

Undefined subroutine &main::Parse

2 个答案:

答案 0 :(得分:6)

你需要写:

print module::Parse("value");

或更改module包以导出名称Parse

有关从模块导出符号的指导,请参阅http://perldoc.perl.org/perlmod.html#Perl-Modules

(顺便说一句,您应该为模块命名Module而不是module。小写模块名称用于Perl内置功能,如use warnings和{{1} }。)

答案 1 :(得分:2)

有几件事:

  • 首先,使用Local作为模块前缀。这样,如果您在Perl安装中碰巧有一个具有相同名称的模块,它将使用您的。称之为“Local :: Module”。然后,创建一个Local目录,并将模块命名为Module.pm

  • 您必须了解的另一件事是您在另一个名称空间中定义您的模块。默认情况下,在您使用main语句之前,所有内容都位于package命名空间中。这会创建程序包使用的另一个名称空间。这样,如果您的包具有函数foo,并且您已在主程序中定义了函数foo,则它们不会发生冲突。

因此,您有两个选择:One(现在是首选)是简单地调用您的子例程,并在其前面加上完整的包名。第二种是将子程序名称导出到主程序。这可能会导致重复名称出现问题,但每次调用子例程时都不必一直输入包名称。

不导出名称

本地/ Module.pm

# /usr/bin/env perl
# Local/Module.pm
package Local::Module;

use strict;
use warnings;

sub Parse {
    my $value = shift;  #Might as well get it.

    print "I got a value of $value\n";
    return $value;
}
1;    #Need this or the module won't load

program.pl

# /usr/bin/env perl
# program.pl

use strict;
use warnings;

use Local::Module;

Local::Module::Parse("Foo");

使用导出:

本地/ Module.pm

# /usr/bin/env perl
# Local/Module.pm
package Local::Module;

use strict;
use warnings;
use Exporter qw(import);
our @EXPORT_OK(Parse);   #Allows you to export this name into your main program

sub Parse {
    my $value = shift;  #Might as well get it.

    print "I got a value of $value\n";
    return $value;
}
1;    #Need this or the module won't load

program.pl

# /usr/bin/env perl
# program.pl

use strict;
use warnings;

use Local::Module qw(Parse);

Parse("Foo");