Perl模块创建-未定义的子例程

时间:2019-01-30 03:38:39

标签: perl

我是perl的新手,我正在尝试执行此练习,但是它不起作用。

这是我创建的模块。

#!/usr/bin/perl 
use warnings;
use strict;

package Prepare;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw( clean my_print );

sub clean{
return chomp($_[0]);
}

sub my_print{
return print("The Results: $_[0]\n");
}

1;

这是我的脚本test_lib.pl

#!/usr/bin/perl
use warnings;
use strict;

use lib '/home/foobar/code';
use My::Prepare;

print "Enter a word: ";
my $input=<STDIN>;

print "You entered: $varia";

clean($input);
my_print($input);

我收到此错误:

Undefined subroutine &main::clean called at ./test_lib.pl line 13, <STDIN> line 1.

1 个答案:

答案 0 :(得分:10)

在包命名方面,需要达成三点共识:

  • 包文件的位置和名称

  • 包文件(名称空间)的package语句中的
  • 名称

  • 使用该软件包的代码中的use语句

他们需要“同意”如下。

如果文件中的软件包声明为package My::Package;,则该软件包需要用作use My::Package,其文件为目录Package.pm中的My

此目录My本身需要位于解释器将搜索的位置,或者我们需要通知它在哪里寻找。自定义包通常不在默认搜索的目录中,lib pragma的作用是:使用您的

use lib '/home/foobar/code';

我希望其中有My的{​​{1}}目录位于Package.pm目录中。

这是您的示例,具有固定名称和更多调整。

文件/home/foobar/code

/home/foobar/code/My/Prepare.pm

以及使用此模块的脚本

package My::Prepare;

use warnings;
use strict;

use Exporter qw(import);

our @EXPORT_OK = qw( clean my_print );

sub clean { return chomp $_[0] }

sub my_print { print "The Results: $_[0]\n" }

1;

请通过添加或删除适当的路径组件来调整实际目录结构上方的路径。 #!/usr/bin/perl use warnings; use strict; use lib '/home/foobar/code'; use My::Prepare qw(clean my_print); print "Enter a word: "; my $input = <STDIN>; print "You entered: $input"; my $cleaned_input = clean($input); my_print($cleaned_input); 特别突出​​。

一些注意事项。

  • 模块中不需要“ shebang”行(My::

  • 使用上面的Exporter有点现代

  • 我强烈建议使用#!/usr/bin/perl(而不是@EXPORT_OK),以便所有列出的符号必须由模块用户专门导入。那对每个人都更好