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 "example@sqldat.com"
*- यह थोड़े पागल होगा, लेकिन 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;
}