Thanks for the feedback. Here we go with the code.
"Main program"
#!/usr/bin/perl -w
... # docu and version info -- skipped
use strict;
use FileHandle;
use File::stat;
use Getopt::Long;
use POSIX ":sys_wait_h";
use POSIX qw(ceil);
use Socket;
#=====================================================================
+=========
#== Find the lib dir
use Cwd;
use File::Basename;
BEGIN {
my $dir = dirname($0);
my $path;
if ($dir =~ /^\//) {
#--absolute path
$path = $dir;
} elsif ($dir eq ".") {
#-- relative, current dir
$path = getcwd();
} else {
#-- relative, but not from current dir
$dir =~ s/^\.\///;
$path = getcwd()."/$dir";
}
unshift(@INC, "$path/lib");
unshift(@INC, "$path/lib-perl");
unshift(@INC, "$path/lib-perl/sun4-solaris-64int");
}
#=====================================================================
+=========
use Net::TFTP;
use Net::SNMP::Security::USM v3.0.0;
use IsamCli;
use Isam7354RUCli;
use Crypt::Lite;
use Utils; # -- BB --
use Octopus;
use Capability;
use ToolCommon qw(:CONSTANTS);
use PbmtConfig;
use ErrorCodes qw(:EXIT_CODES :SWDL);
use FamilyCommon;
....
Here we see the (among others):
use Octopus;
use Capability;
This is the Octopus.pm module (at least a the beginning):
package Octopus;
use strict;
use File::Basename;
use Cwd;
BEGIN {
my $dir = dirname($0);
my $path;
if ($dir =~ /^\//) {
#--absolute path
$path = $dir;
} elsif ($dir eq ".") {
#-- relative, current dir
$path = getcwd();
} else {
#-- relative, but not from current dir
$dir =~ s/^\.\///;
$path = getcwd()."/$dir";
}
unshift(@INC, "$path/lib");
unshift(@INC, "$path/lib-perl");
}
require Utils;
require Capability;
use ErrorCodes qw(:EXIT_CODES);
use ToolCommon qw(:CONSTANTS);
require ReduceSWP;
...
So here again we have the usage of the module Capability
because this module contains functions that logically belong
there (it is a module having capabilities of elements it is
dealing with).
Now we turn to the Capability module. Half of this module
is data (intented to be static). The rest of the module are
accessor functions to access the data elements to prevent
"direct" usage of the hashes defined inside but rather
retrieve the data through the accessor functions. We are not using the Exporter (I tried it but it made no difference).
package Capability;
use strict;
use Cwd;
use File::Basename;
BEGIN {
my $dir = dirname($0);
my $path;
if ($dir =~ /^\//) {
#--absolute path
$path = $dir;
} elsif ($dir eq ".") {
#-- relative, current dir
$path = getcwd();
} else {
#-- relative, but not from current dir
$dir =~ s/^\.\///;
$path = getcwd()."/$dir";
}
unshift(@INC, "$path/lib");
unshift(@INC, "$path/lib-perl");
}
use IsamCli;
use ToolCommon qw(:CONSTANTS);
use ErrorCodes qw(:EXIT_CODES);
#=====================================================================
+=========
#== Prototypes
#=====================================================================
+=========
sub GetVersion();
sub GetError();
...
my %ntCapabilities = ('EANT-A' => {'SW_PAR' => undef},
'EBNT-A' => {'SW_PAR' => undef},
'ECNT-A' => {'SW_PAR' => $ECNTA_MINSWPARSIZE,
'PREFIX' => {'ALL' => 'L5YY'},
'BRDCODE' => 12355,
'SAFE_ICS' => 13,
'SHUB_TYPE' => 'ECNTA',
'EQPT_TYPE' => $XD,
'IF_BASE' => $OTHER_IFBASE,
'FAMILY' => {'ALL' => $ISAM,
'400 410' => $ISAM_ANSI},
'NO_UPG' => {'240' => [$IMPOSSIBLE, $FTP_ISSUE],
'241' => ['248 249 244 246', $INCOMP_RELSTREAM
+],
'242' => ['248 249 244 246', $INCOMP_RELSTREAM
+]},
'NO_MIG' => {'117' => [$IMPOSSIBLE,
'No migration possible from this release
+'], # No migrations for this release
'233' => ['241 242 243 248 249 244 246 250',
'Feature incompatibilty w.r.t. pppoe rel
+ay tagging'], # No migrations due to pppoe relay tags of 2.3.03
'240' => [$IMPOSSIBLE,
'No upgrade possible due to file transfe
+r problem'],
'241' => ['248 249 244 246 300', $INCOMP_RELST
+REAM],
'242' => ['248 249 244 246 300', $INCOMP_RELST
+REAM],
'244' => ['250 300 310 320', $INCOMP_RELSTREAM
+],
'245' => ['250', $NO_MIG_PATH ],
'246' => ['250 300 310 320', $INCOMP_RELSTREAM
+],
'248' => ['250', $INCOMP_RELSTREAM],
'249' => ['250', $INCOMP_RELSTREAM],
'250' => ['300', $INCOMP_RELSTREAM]},
'MIG_EXCLUDED_TO' => {$ISAM => "330 340 400"} },
....
);
The problem I have is occuring on this hash. To determine the presence of an element I use the statement
defined($ntCapabilities{$type}{'SW_PAR'}).
When I remove the call require Capability.pm from Octopus.pm
and replace the function call by the code executed by the function the program is running fine, if the require statement is present and I use the accessor function, the program fails for exactly the same element that was OK when the require was removed.
It is the intention that the data hash remains "local" to
Capability.pm.
I hope this is sufficient code allowing a "judgement". |