私の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と同じディレクトリにあり、useロードされていないようです。ただし、dを実行するとエラーは発生しません。このモジュール内のサブルーチンを呼び出すと、そのサブルーチンが存在しないというメッセージが表示されます。このモジュールは私たちの環境の他の多くのスクリプトで使用され、うまく動作します。

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つにこのモジュールが機能しないようにする何かがあるとしますが、それが何であるかはわかりません。この問題は、これらのモジュールを呼び出す他のスクリプトでも発生します。

ベストアンサー1

our @export問題は、文がdba_functions.pm実際に.Caseになるはずですour @EXPORT。 Perlでは、ケースが重要です。

おすすめ記事