LD_LIBRARY_PATH zmienna środowiskowa musi być ustawiona przed Twój program się uruchomi — przed perl sam jest załadowany. Zmiana w BEGIN{} wpłynie na nowe programy zaczynasz, ale nie wpłynie to na ładowanie bibliotek współdzielonych — w tym przypadku (chociaż nigdy nie korzystałem z DBD::Oracle) ładujesz plik Oracle .so do już działającego programu, więc jest „za późno” na zmianę LD_LIBRARY_PATH . Dynamiczny linker /lib/ld.so (lub tak) jest uruchamiany przed perl , więc do czasu skompilowania skryptu i BEGIN{} działa, jest już skonfigurowany.
możesz spróbuj ponownie wykonać swój skrypt jako jego własnego następcę lub coś takiego*, ale krótki skrypt powłoki prawie na pewno będzie najprostszym rozwiązaniem:
#!/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 "example@sqldat.com"
*- to byłoby trochę szalone, ale TIMTOWTDI:
eval {
use DBD::Oracle foo bar baz; …
};
if (example@sqldat.com =~ /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\example@sqldat.com\n";
exec { $0 } $0 => @ARGV;
}