我是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.
1条答案
按热度按时间lb3vh1jj1#
在包命名方面,有三点需要达成一致:
他们需要“同意”如下。
如果软件包文件中的软件包声明为
package My::Package;
,则软件包需要用作use My::Package
,其文件为My
目录中的Package.pm
。这个目录
My
本身需要位于解释器将要搜索的位置,或者我们需要通知它去哪里查找。定制包通常不在默认搜索的目录中,而这正是lib pragma的作用:与您的我希望
My
目录(其中包含Package.pm
)位于/home/foobar/code
目录中。下面是您的示例,名称是固定的,并进行了一些调整。
文件
/home/foobar/code/My/Prepare.pm
:以及使用此模块的脚本
请根据实际的目录结构调整上面的路径,适当地添加或删除路径组件。特别是名称
My::
。几个音符。
#!/usr/bin/perl
)@EXPORT_OK
(而不是@EXPORT
),这样所有列出的符号都必须由模块的用户专门导入。clean
的sub返回一个list,所以我们需要从它 * 赋值给一个list*;赋值给标量将导致赋值列表的元素数。因此,即使只传递一个变量,我们也需要这些括号来表示列表赋值,
my ($cleaned_input) = ...
,所以从子函数返回的标量列表被赋值给左侧的变量列表(括号中),一对一。然后,当返回一个只有一个变量的列表时,它被赋值给括号中列出的第一个变量。如果没有括号,
$cleaned_input
将被赋值为1
,在本例中为返回列表的长度。