我在perl中有一个共享模块。主程序需要两个文件,第一个是共享文件(让我们称之为' X'),第二个是'包'文件。文件' X'也包含在'包中文件使用'要求'。当我编译这个程序时,它给了我以下错误:
Undefined subroutine &main::trim called at testing.pl line 8.
我的理解是perl无法找到trim()模块。如果我不包含软件包文件,那么这将运行没有任何问题。
有人可以解释这个问题吗?
这些是我的代码:
主程序:testing.pl
#!/usr/bin/perl -w
use strict;
use postgres;
require "shared.pl";
trim("als");
包裹文件:postgres.pm
#!/usr/bin/perl
package postgres;
use strict;
use DBI;
require "shared.pl";
1;
共享文件:shared.pl
#!/usr/bin/perl
# =============
# shared module
# =============
use strict;
sub trim($)
{
}
1;
答案 0 :(得分:5)
如果模块未使用package
,则需要do
而不是require
。请参阅What is the difference between library files and modules?。
do "shared.pl" or die $@;
你真的应该创建一个合适的模块,一个带有package
语句的模块。
package Shared;
use strict;
use warnings;
our @EXPORT = qw( trim );
use Exporter qw( import );
sub trim { ... }
1;
将文件命名为Shared.pm
并使用use Shared;
加载。
答案 1 :(得分:2)
默认情况下,require
只会加载一次文件。在这种情况下,一次来自postgres.pm
包中的文件postgres
。因此,trim
子例程在postgres
命名空间中定义为&postgres::trim
。
一种解决方法是在testing.pl
文件中使用完全限定的子例程名称:
postgres::trim("als"); # not trim("als")
另一种解决方法是破解%INC
表(跟踪已经存在的模块/文件的变量use
'和require
'),以便您可以重新加载{ {1}}进入主包:
shared.pl
第三种解决方法是将use postgres;
delete $INC{"shared.pl"};
require "shared.pl";
函数从trim
包导出到主包。 Exporter
模块的文档很好地介绍了为什么以及如何完成。
postgres