edwardt_tril has asked for the wisdom of the Perl Monks concerning the following question:

hi I am trying to use a subroutine from another perl file.
but even though I "include" it, it is still not
visible? I was forced to make the other perl file as a
package, but it sometimes works sometimes it fails because
it does not see that subroutine again. why is that? I want to use getClientListFromReg, printpair, createPair in client_reg.pl

ERROR MSG: C:\tool\SCSEvent>perl testclientreg.pl
Undefined subroutine &main::getClientListFromReg called at testclientreg.pl line
17, <IN> line 18.
code for client_reg.pl
#package client_reg; use vpcommon; #require Exporter; #@ISA = qw(Exporter); # Items to export into caller's namespace by default. #@EXPORT = qw(getClientListFromReg); use Win32::Registry; $DEBUG = 0; do ('sub_ErrorLog.pl'); %regKey_array=(); #global ################################################################### # sub createPair # Desc: pair up a key with a value and put them into an assiciative ar +ray # # ###################################################################### +# sub createPair{ my($key, $value) = @_ ; $regKey_array{$key} = $value; }; # end sub createPair ################################################################### # sub printPair # Desc: print the pair of a key with a value from an associative array # # ###################################################################### +# sub printPair{ #my($key, $value) = @_ ; while (($key, $value) = each %regKey_array) { print("$key, $value\n"); }; }; # end sub printPair ###################################################################### # # sub getClientListFromReg() # DEsc: return a list of clients name in string from regkey # defined in CONST_REG_KEY_CLIENTKEY in file LogUpdater_conf.con +f # default return is "None" # # ###################################################################### +# sub getClientListFromReg { local ($targetRegKey)=@_; local(@clientList,%clientNamesHash,$reg_handle); my $handle; my $SubKeys; my $key; # open regkey hive $handle = $::HKEY_LOCAL_MACHINE->Open($targetRegKey, $SubKeys); die("Unable to open $targetRegKey") unless defined($SubKeys); # get a list of sub reg keys under hive, put them into an array $SubKeys->GetKeys(\@clientList); my $idx =0; my $position = 0; local ($s); # loop through each array element, chop the Guid out from client k +ey # put the result into an associative array with key index foreach $key (@clientList) { $position = index($key,'_::'); $s = substr($key,0,$position); createPair($idx,$s); $idx = $idx+1; } if ($DEBUG) { printPair}; # close reg key hive $::HKEY_LOCAL_MACHINE->Close(); } # end getClientListFromReg
callee's code:
do (client_reg.pl); $debug =0; ##### read in config file ############################## $SvcConfFile1 = 'LogUpdater_conf.conf'; open(IN,"<:utf8", "$SvcConfFile1") || print "Unable to open $SvcConfFi +le1"."\n"; while (<IN>) { chop($_); eval $_; } ################################################ # populate the regkeyarray getClientListFromReg($SAVCLIENTKEY); print %regKey_array;

Replies are listed 'Best First'.
Re: why this funciton is invisible?
by PodMaster (Abbot) on Dec 06, 2005 at 07:07 UTC
    You should
    use strict; use warnings;
    (and diagnostics if the error messages aren't clear enough).

    Here's one problem that would've been revealed by strict/warnings

    C:\>more client_reg.pl sub hi{print q,hi,} C:\>perl -e" do (client_reg.pl);hi()" Undefined subroutine &main::hi called at -e line 1. C:\>perl -we" do (client_reg.pl);hi()" Unquoted string "pl" may clash with future reserved word at -e line 1. Undefined subroutine &main::hi called at -e line 1. C:\>perl -Mstrict -we" do (client_reg.pl);hi()" Bareword "client_reg" not allowed while "strict subs" in use at -e lin +e 1. Bareword "pl" not allowed while "strict subs" in use at -e line 1. Execution of -e aborted due to compilation errors. C:\>perl -Mstrict -we" do q(client_reg.pl);hi()" hi C:\>
    do can also fail to read and execute a file, so you should check for that (you can read more about do in the docs: 'perldoc -f do').

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.