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 & below calls subrtn exportfile in to set env-var LOGICALfilename=PhysicalFileName
- 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 ?

# 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/sales.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
# - perl subrtns to support perl scripts converted from MVS JCL
#                - see doc at:
#                - 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:$PERL5LIB  # 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");
$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);
Who is Participating?
DarthModConnect With a Mentor Commented:
PAQed with points refunded (500)

Community Support Moderator
looks like you have a syntax error here:

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.
Owen_TownsendAuthor Commented:
Thanks Perl Diver, but changing to 'use Exporter;' made no difference.
$ENV{SORTIN} = "ar/sales.items";
require Env; import Env;
print "$SORTIN\n";
Owen_TownsendAuthor Commented:
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/sales.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
and I will soon have a new doc called mvsjclperl.htm.
Thanks again to all the respondents above.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.