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

kiz8lqtg  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(195)

我是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,  line 1.
lb3vh1jj

lb3vh1jj1#

在包命名方面,有三点需要达成一致:

  • 程序包文件的位置和名称
  • 程序包文件中package语句中的名称(命名空间)
  • 在使用它的代码中的包的use语句

他们需要“同意”如下。
如果软件包文件中的软件包声明为package My::Package;,则软件包需要用作use My::Package,其文件为My目录中的Package.pm
这个目录My本身需要位于解释器将要搜索的位置,或者我们需要通知它去哪里查找。定制包通常不在默认搜索的目录中,而这正是lib pragma的作用:与您的

use lib '/home/foobar/code';

我希望My目录(其中包含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 { 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),这样所有列出的符号都必须由模块的用户专门导入。
  • 与 Package 无关但很重要:clean的sub返回一个list,所以我们需要从它 * 赋值给一个list*;赋值给标量将导致赋值列表的元素数。

因此,即使只传递一个变量,我们也需要这些括号来表示列表赋值,my ($cleaned_input) = ...,所以从子函数返回的标量列表被赋值给左侧的变量列表(括号中),一对一。
然后,当返回一个只有一个变量的列表时,它被赋值给括号中列出的第一个变量。如果没有括号,$cleaned_input将被赋值为1,在本例中为返回列表的长度。

相关问题