Perl问题'需要'相同的文件

时间:2011-07-22 17:28:16

标签: perl

我在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;

2 个答案:

答案 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