【问题标题】:Perl Module Creation - Undefined subroutinePerl 模块创建 - 未定义的子例程
【发布时间】:2019-06-23 06:54:00
【问题描述】:

我是 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);

我收到此错误:

在 ./test_lib.pl 第 13 行第 1 行调用了未定义的子例程 &main::clean。

【问题讨论】:

  • 您的包名为Prepare,而不是My::Prepare。将use My::Prepare; 更改为use Prepare;
  • 问题:与脚本(和/或use lib 中的路径)相关的模块文件在哪里?该(模块)文件的名称是什么?
  • package Prepare;, use My::Prepare;... 其中一个是错误的。

标签: perl module package


【解决方案1】:

在包命名方面,需要同意三点:

  • 包文件的位置和名称

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

  • 使用它的代码中的包的use 语句

他们需要“同意”如下。

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

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

use lib '/home/foobar/code';

我希望包含Package.pmMy 目录位于/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 { chomp(@_); return @_ }

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);

请根据您的实际目录结构调整上述路径,方法是根据需要添加或删除路径组件。 My:: 这个名字特别突出。

一些笔记。

  • 模块中不需要“shebang”行 (#!/usr/bin/perl)

  • 使用上面的Exporter 更现代一点

  • 我强烈建议使用@EXPORT_OK(而不是@EXPORT),这样所有列出的符号都必须由模块用户专门导入。这对每个人都更好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 2013-08-13
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多