O problema parece ser que a instrução our @export
em dba_functions.pm
deve, na verdade, ser our @EXPORT
. O caso é importante para o Perl.
Eu tenho um script em Perl que começa assim (foi escrito por alguém que não trabalha mais aqui, mas foi modificado várias vezes desde então):
#!/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;
Os módulos 'DBA.pm' e 'DBA / MySQL.pm' funcionam bem. Mas o módulo dba_functions, que existe no mesmo diretório do DBA.pm, sem erros, quando use
d não parece estar carregado. Uma chamada para qualquer sub dentro desse módulo reclama de uma sub-rotina inexistente. O módulo é usado em muitos outros scripts em nosso ambiente e funciona bem.
Agora, DBA.pm e DBA / MySQL.pm possuem um design orientado a objetos, enquanto dba_functions.pm é apenas uma coleção de sub-rotinas. Por exemplo, DBA.pm começa assim:
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 é uma versão antiga e obsoleta do dba_functions.pm, mas não consegui mudar para a nova versão devido a esse problema)
dba_functions.pm começa assim:
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.
Estou assumindo que há algo em um dos outros módulos que está fazendo com que este não funcione, mas não tenho ideia do que. Esse problema acontece com outro script que chama esses módulos também.
O problema parece ser que a instrução our @export
em dba_functions.pm
deve, na verdade, ser our @EXPORT
. O caso é importante para o Perl.
Tags perl