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".

In reply to Re^3: "use" modules inside modules by bogaertb
in thread "use" modules inside modules by bogaertb

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.