나는 다음과 같이 시작하는 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
our @export
문제는 의 문이 dba_functions.pm
실제로 .Case가 되어야 한다는 것입니다 our @EXPORT
. Perl에서는 Case가 중요합니다.