Owen_Townsend
asked on
How to set env-var in pkg subrtn to be effective in perl script ?
How can I make env-vars set in package suprtns effective on return to perl script ?
I have included testenv1.pl & testexport1.pm below
testenv1.pl calls subrtn exportfile in testexport1.pm to set env-var LOGICALfilename=PhysicalFi leName
- this works for Micro Focus COBOL programs with 'external' on the select assign statements
- BUT why does it not work for $symbols referenced in the perl script ?
- I specify 'use Env;' which should make env-vars available to perl script ?
- which works for symbols such as $HOME already set,
- but does not seem to work for $SYMBOLs set in the subrtn
- makes no sense if COBOL can get it (via getenv I assume) why not the perl script ?
#!/usr/bin/perl
# testenv1 - perl script to test 'use Env'
# - why efective only for symbols already in env
# - why NOT for symbols added to env by script ???
use Env; use testexport1;
print("HOME=$HOME\n"); #<-- 'use Env' works for symbols already defined
exportfile("SORTIN","ar/sa les.items" ); #<-- subrtn adds SORTIN to env
#========================= ========== ==
# - exportfile subrtn adds $SYMBOLS to the environment
# - effective for COBOL which gets symbol defs from environment
# cobrun program <-- my COBOL programs do see $SYMBOLs set in exportfile subrtn
#===========
# - BUT why are these $SYMBOLS not seen by perl script ? (via 'use Env;') ?
print("DEBUG1: SORTIN=$SORTIN\n"); #<-- $SORTIN is still null ?
$SORTIN = $ENV{SORTIN}; #<-- redefine here (already done in subrtn)
print("DEBUG2: SORTIN=$SORTIN\n"); #<-- now we see it
exit(0);
#
#------------------------- ---------- ---------- ---------- ---------- ------
# testexport1.pm - perl subrtns to support perl scripts converted from MVS JCL
# - see doc at: www.uvsoftware.ca/mvs2unix.htm
# - export files for Micro Focus COBOL
# - export LOGICAL-filename $SYMBOLS with physical-filenames
#
# profile should include following so perl modules will be found
# export PERL5LIB=$UV/perlm:$PERL5L IB # perl modules 'use'd by perl scripts
# ========================== =========
#
package testexport1;
use Env; Exporter;
our (@Export, @ISA);
@ISA = qw(Exporter);
@EXPORT = qw(exportfile);
#
# exportfile CUSTMAS ap/customer.master #<-- JCL/script call
# ========================== ========== =
# export CUSTMAS=ap/customer.master #<-- result
# ========================== =======
#Note - main reason for using this function (vs coding export directly)
# is to display the DDname & DSNname on the console log
#
sub exportfile
{
$lfd=$_[0]; $lbl=$_[1]; # capture args into named variables
#
if ( "$lfd" && "$lbl" ) { ; }
else { print("exportfile requires 2 args: DDNname=$lfd, DSName=$lbl\n");
exit(81);
}
#
$ENV{$lfd} = "$lbl"; # export LogicalName = PhysicalName
#=================== # COBOL programs need LFD in environment
#
# display lfd & lbl with filesize
$fsize = (-s "$RUNDATA/$lbl");
$fmsg = sprintf("file: %s=%s bytes=%d",$lfd,$lbl,$fsize );
print("$fmsg\n");
return(0);
}
I have included testenv1.pl & testexport1.pm below
testenv1.pl calls subrtn exportfile in testexport1.pm to set env-var LOGICALfilename=PhysicalFi
- this works for Micro Focus COBOL programs with 'external' on the select assign statements
- BUT why does it not work for $symbols referenced in the perl script ?
- I specify 'use Env;' which should make env-vars available to perl script ?
- which works for symbols such as $HOME already set,
- but does not seem to work for $SYMBOLs set in the subrtn
- makes no sense if COBOL can get it (via getenv I assume) why not the perl script ?
#!/usr/bin/perl
# testenv1 - perl script to test 'use Env'
# - why efective only for symbols already in env
# - why NOT for symbols added to env by script ???
use Env; use testexport1;
print("HOME=$HOME\n"); #<-- 'use Env' works for symbols already defined
exportfile("SORTIN","ar/sa
#=========================
# - exportfile subrtn adds $SYMBOLS to the environment
# - effective for COBOL which gets symbol defs from environment
# cobrun program <-- my COBOL programs do see $SYMBOLs set in exportfile subrtn
#===========
# - BUT why are these $SYMBOLS not seen by perl script ? (via 'use Env;') ?
print("DEBUG1: SORTIN=$SORTIN\n"); #<-- $SORTIN is still null ?
$SORTIN = $ENV{SORTIN}; #<-- redefine here (already done in subrtn)
print("DEBUG2: SORTIN=$SORTIN\n"); #<-- now we see it
exit(0);
#
#-------------------------
# testexport1.pm - perl subrtns to support perl scripts converted from MVS JCL
# - see doc at: www.uvsoftware.ca/mvs2unix.htm
# - export files for Micro Focus COBOL
# - export LOGICAL-filename $SYMBOLS with physical-filenames
#
# profile should include following so perl modules will be found
# export PERL5LIB=$UV/perlm:$PERL5L
# ==========================
#
package testexport1;
use Env; Exporter;
our (@Export, @ISA);
@ISA = qw(Exporter);
@EXPORT = qw(exportfile);
#
# exportfile CUSTMAS ap/customer.master #<-- JCL/script call
# ==========================
# export CUSTMAS=ap/customer.master
# ==========================
#Note - main reason for using this function (vs coding export directly)
# is to display the DDname & DSNname on the console log
#
sub exportfile
{
$lfd=$_[0]; $lbl=$_[1]; # capture args into named variables
#
if ( "$lfd" && "$lbl" ) { ; }
else { print("exportfile requires 2 args: DDNname=$lfd, DSName=$lbl\n");
exit(81);
}
#
$ENV{$lfd} = "$lbl"; # export LogicalName = PhysicalName
#=================== # COBOL programs need LFD in environment
#
# display lfd & lbl with filesize
$fsize = (-s "$RUNDATA/$lbl");
$fmsg = sprintf("file: %s=%s bytes=%d",$lfd,$lbl,$fsize
print("$fmsg\n");
return(0);
}
ASKER
Thanks Perl Diver, but changing to 'use Exporter;' made no difference.
Owen
Owen
$ENV{SORTIN} = "ar/sales.items";
require Env; import Env;
print "$SORTIN\n";
require Env; import Env;
print "$SORTIN\n";
ASKER
Thanks to all above for taking the time to reply.
I should have explained what I am trying to do here.
I am converting mainframe JCL to perl scripts to run on unix/linux.
My objective was to define files for COBOL using just 1 line per file,
since there could be many files prior to each COBOL program execution.
I think now I need 2 lines per file as follows:
1. exportfile("SORTIN","ar/sa les.items" ); # subrtn adds SORTIN to env
#========================= ========== == # via: $ENV{$_[0]} = "$_[1]";
2a. use Env ("SORTIN"); # suggested by kenslate & anno4 <-- IT WORKS
#==================
2b. $SORTIN = $ENV{SORTIN}; # OR I could use this (less overhead ?)
#======================
I think I should probably use '2b.' above as the 2nd line,
since I assume there would be less overhead.
I was converting JCL to Korn shell scripts & am now changing over to perl.
If interested please see www.uvsoftware.ca/mvsjcl.htm
and I will soon have a new doc called mvsjclperl.htm.
Thanks again to all the respondents above.
Owen
I should have explained what I am trying to do here.
I am converting mainframe JCL to perl scripts to run on unix/linux.
My objective was to define files for COBOL using just 1 line per file,
since there could be many files prior to each COBOL program execution.
I think now I need 2 lines per file as follows:
1. exportfile("SORTIN","ar/sa
#=========================
2a. use Env ("SORTIN"); # suggested by kenslate & anno4 <-- IT WORKS
#==================
2b. $SORTIN = $ENV{SORTIN}; # OR I could use this (less overhead ?)
#======================
I think I should probably use '2b.' above as the 2nd line,
since I assume there would be less overhead.
I was converting JCL to Korn shell scripts & am now changing over to perl.
If interested please see www.uvsoftware.ca/mvsjcl.htm
and I will soon have a new doc called mvsjclperl.htm.
Thanks again to all the respondents above.
Owen
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
package testexport1;
use Env; Exporter;
should be:
package testexport1;
use Env;
use Exporter;
Also, the Env module is probaly not doing what you think or hope it is.