LD_LIBRARY_PATH
променливата на средата трябва да бъде зададена преди вашата програма стартира — преди perl
самата е заредена. Промяна в BEGIN{}
ще засегне нови програми който стартирате, но това няма да повлияе на зареждането на споделени библиотеки — в този случай (въпреки че никога не съм използвал DBD::Oracle) вие зареждате Oracle .so
във вече работещата програма, така че е „твърде късно“ да промените LD_LIBRARY_PATH
. Динамичният линкер /lib/ld.so
(или така) се стартира преди perl
, така че докато вашият скрипт бъде компилиран и BEGIN{}
работи, вече е настроено.
Вие можете опитайте да изпълните отново скрипта си като негов собствен наследник или нещо подобно*, но кратък скрипт на обвивката почти сигурно ще бъде най-простото решение:
#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client64/lib
export ORACLE_SID=prod
exec /usr/local/bin/your-db-program "[email protected]"
*- това би било доста лудо, но TIMTOWTDI:
eval {
use DBD::Oracle foo bar baz; …
};
if ([email protected] =~ /install_driver\(Oracle\) failed/) {
$ENV{LD_LIBRARY_PATH} .= ':/usr/lib/oracle/10.2.0.3/client64/lib';
$ENV{ORACLE_SID} = 'prod';
warn "Restarting with LD_LIBRARY_PATH reset:\n\[email protected]\n";
exec { $0 } $0 => @ARGV;
}