Por que este módulo não está sendo visto pelo meu script Perl?

1

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.

    
por Swechsler 19.10.2017 / 22:28

1 resposta

2

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.

    
por 19.10.2017 / 23:08

Tags