LD_LIBRARY_PATH biến môi trường phải được đặt trước chương trình của bạn bắt đầu - trước perl chính nó đã được tải. Thay đổi nó trong BEGIN{} sẽ ảnh hưởng đến các chương trình mới mà bạn bắt đầu, nhưng nó sẽ không ảnh hưởng đến việc tải thư viện được chia sẻ - trong trường hợp này (mặc dù tôi chưa bao giờ sử dụng DBD ::Oracle), bạn đang tải một .so của Oracle vào chương trình đã chạy, vì vậy đã “quá muộn” để thay đổi LD_LIBRARY_PATH . Trình liên kết động /lib/ld.so (hoặc lâu hơn) được bắt đầu trước perl , do đó, vào thời điểm tập lệnh của bạn được biên dịch và BEGIN{} đang chạy, nó đã được thiết lập.
Bạn có thể cố gắng thực thi lại tập lệnh của bạn dưới dạng kế thừa của chính nó hoặc thứ gì đó *, nhưng một tập lệnh shell ngắn gần như chắc chắn sẽ là giải pháp đơn giản nhất:
#!/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"
* - điều này hơi điên rồ, nhưng 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;
}