LD_LIBRARY_PATH variabel lingkungan harus ditetapkan sebelum program Anda dimulai — sebelum perl sendiri dimuat. Mengubahnya di BEGIN{} akan memengaruhi program baru yang Anda mulai, tetapi itu tidak akan memengaruhi pemuatan pustaka bersama — dalam hal ini (walaupun saya tidak pernah menggunakan DBD::Oracle) Anda memuat .so Oracle ke dalam program yang sudah berjalan, jadi sudah “terlambat” untuk mengubah LD_LIBRARY_PATH . Penaut dinamis /lib/ld.so (atau lebih) dimulai sebelum perl , jadi pada saat skrip Anda dikompilasi dan BEGIN{} berjalan, itu sudah disiapkan.
Anda bisa coba jalankan kembali skrip Anda sebagai penerusnya sendiri atau semacamnya*, tetapi skrip shell pendek hampir pasti akan menjadi solusi paling sederhana:
#!/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"
*- ini agak gila, tapi 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;
}