Remember that "use" is a kind of BEGIN block. You have to set the ENV
variables in a BEGIN block before the "use" line.

Sent from my phone (sorry if my reply is brief, ask me again when I'm at a
real keyboard)
On Feb 19, 2014 9:23 AM, "Bruce Johnson" <john...@pharmacy.arizona.edu>
wrote:

> Well, I've identified my solution, but I'm not entirely certain why it's
> working.
>
> Setting the environment variables in a shell script wrapper around my perl
> script works. Despite %ENV being identical, when set within the perl
> script, I get the error, when set in the .sh wrapper it works.
>
> It appears to be that called modules via 'use MODULE;' do NOT share the
> environment of the calling perl script?
>
> These are my test scripts:
>
> test.sh script
>
> #!/bin/sh
>
> ORACLE_HOME=/usr/lib/oracle/11.2/client64
> LD_LIBRARY_PATH=$ORACLE_HOME/lib
> ORACLE_SID=PHMWEB
> export ORACLE_HOME LD_LIBRARY_PATH ORACLE_SID
> echo "testing connection"
> /home/allwebfiles/perl/kfs/test.pl
> echo "Done testing connection"
>
>
> test.pl script
>
> #!/usr/bin/perl -w
>
> $ENV{"ORACLE_HOME"}="/usr/lib/oracle/11.2/client64";
> $ENV{"ORACLE_SID"}="phmweb";
> $ENV{"LD_LIBRARY_PATH"}="/usr/lib/oracle/11.2/client64/lib";
>
> use DBI;
>
> my $login = 'scott';
> my $dbpass = 'tiger';
> my $dbhost='pharmacopeia.pharmacy.arizona.edu;sid=phmweb'<< substitute
> your own host here
>
> print "Environment:\n";
> foreach my $e (keys %ENV){
>         print "env var $e = $ENV{$e} \n";
>         }
>
> print "\n";
> print"DB test: sysdate = ";
> my $dbh = DBI->connect( "dbi:Oracle:host=$dbhost", $login, $dbpass,
>                       { RaiseError => 1 } );
> my $csr= $dbh->prepare("select sysdate from dual");
> $csr->execute();
> my ($out) = $csr->fetchrow();
> print "$out\n";
> $csr->finish();
> $dbh->disconnect;
>
>
> I tested this first by commenting out the $ENV{}=''; lines in the perl
> script, leaving the ones in test.sh intact:
>
> [root@merthiolate ~]# env -i /home/allwebfiles/perl/kfs/test.sh
> testing connection
> Environment:
> env var ORACLE_HOME = /usr/lib/oracle/11.2/client64
> env var SHLVL = 1
> env var LD_LIBRARY_PATH = /usr/lib/oracle/11.2/client64/lib
> env var PWD = /root
> env var _ = /home/allwebfiles/perl/kfs/test.pl
> env var ORACLE_SID = PHMWEB
>
> DB test: sysdate = 19-FEB-14
> Done testing connection
>
> Then I commented out the first four lines of test.sh and uncommented the
> lines in test.pl
>
> env -i /home/allwebfiles/perl/kfs/lddtest.sh
> testing connection
> Environment:
> env var ORACLE_HOME = /usr/lib/oracle/11.2/client64
> env var LD_LIBRARY_PATH = /usr/lib/oracle/11.2/client64/lib
> env var SHLVL = 1
> env var PWD = /root
> env var _ = /home/allwebfiles/perl/kfs/test.pl
> env var ORACLE_SID = phmweb
>
> install_driver(Oracle) failed: Can't load
> '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle:
> libocci.so.11.1: cannot open shared object file: No such file or directory
> at /usr/lib64/perl5/DynaLoader.pm line 200.
>  at (eval 3) line 3
> Compilation failed in require at (eval 3) line 3.
> Perhaps a required shared library or dll isn't installed where expected
>  at /home/allwebfiles/perl/kfs/test.pl line 18
> DB test: sysdate = Done testing connection
>
> It appears that DBI is NOT inheriting the environment when it's called via
> 'use DBI' even though it's called after I explicitly set them within the
> perl script.
>
>
> --
> Bruce Johnson
> University of Arizona
> College of Pharmacy
> Information Technology Group
>
> Institutions do not have opinions, merely customs
>
>
>

Reply via email to