为什么我的 Perl 脚本看不到这个模块?

为什么我的 Perl 脚本看不到这个模块?

我有一个 Perl 脚本,它的开头是这样的(它是由不再在这里工作的人编写的,但从那时起它已经被修改了几次):

#!/usr/bin/perl -w

BEGIN
{
    use File::Basename;
    my ($scriptname, $dirname, $extension) = fileparse ($0, ".pl");

    push (@INC, ("$dirname/../../shared/lib"));
    push (@INC, ("$dirname/../../shared/lib/DBA"));
}


use strict;
use File::Path;
use File::Basename;
use Getopt::Std;
use Cwd 'realpath';
use DBA;
use DBA::MySQL;
use dba_functions;

模块“DBA.pm”和“DBA/MySQL.pm”工作正常。但是 dba_functions 模块与 DBA.pm 位于同一目录中,虽然在used 时没有给出错误,但似乎并未加载。对该模块内任何子程序的调用都会抱怨子例程不存在。该模块在我们环境中的许多其他脚本中使用并且工作正常。

现在,DBA.pm 和 DBA/MySQL.pm 都有面向对象的设计,而 dba_functions.pm 只是子例程的集合。例如,DBA.pm 的开头是这样的:

package DBA;

use 5.008;
use strict;
use warnings;
use Carp;
use DBI;
use Fcntl qw (:flock);
use Term::ReadKey;
use DBA::MySQL;
use DBA::Config;
use DBA::MessageLogger;
use DBA::Util qw(rearrange make_attributes);
use Date::Format;
use File::Path;
use File::Find;
use File::Copy;
use File::Basename;
use vars qw($VERSION);
use User::pwent;

our $VERSION = '0.01';

BEGIN
{
    use File::Basename;
    use Cwd 'realpath';
    push (@INC, realpath(dirname($0) . "/../../shared/lib"));
}

use Cwd 'realpath';
require "dba_functions.pl";

sub new
{
    my ($class, @p) = @_;

(dba_functions.pl是dba_functions.pm的旧版本,但由于这个问题我无法切换到使用新版本)

dba_functions.pm 像这样开始:

require Exporter;

use strict;
use warnings;
#use ServiceNow;
#use ServiceNow::Configuration;
use LWP;

our @ISA = qw(Exporter);
our @export = qw(date
             @pfiles
             dba_archive_file
             dba_distribute_file
             dba_force_update_puppet
[list of subroutines]
use DBI;
use Net::SMTP;
use File::Basename;
use File::Copy;
use Data::Dumper;
use Crypt::OpenSSL::AES;
use Errno qw(EAGAIN);
use POSIX ":sys_wait_h";
use Cwd 'realpath';

use constant MYSQL_HOME => "/opt/mysql/instance";
[more constant definitions]
[variable definitions]

sub subroutine_name($;$) {
etc.

我假设其他模块之一中有某些东西导致该模块无法工作,但我不知道是什么。调用这些模块的其他脚本也会出现此问题。

答案1

问题似乎是our @export中的语句dba_functions.pm实际上应该是our @EXPORT.大小写对于 Perl 来说很重要。

相关内容