私は次のように起動する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では、ケースが重要です。