De LD_LIBRARY_PATH
omgevingsvariabele moet voor worden ingesteld je programma start — vóór perl
zelf wordt geladen. Wijzigen in BEGIN{}
heeft invloed op nieuwe programma's die u start, maar het heeft geen invloed op het laden van gedeelde bibliotheken — in dit geval (hoewel ik de DBD::Oracle nooit heb gebruikt) laad je een Oracle .so
in het reeds lopende programma, dus het is "te laat" om de LD_LIBRARY_PATH
te wijzigen . De dynamische linker /lib/ld.so
(of zo) is gestart vóór perl
, dus tegen de tijd dat uw script is gecompileerd en BEGIN{}
wordt uitgevoerd, is het al ingesteld.
Je zou probeer je script opnieuw uit te voeren als zijn eigen opvolger of zoiets*, maar een kort shellscript zal vrijwel zeker de eenvoudigste oplossing zijn:
#!/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]"
*- dit zou een beetje gek zijn, maar 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;
}