如何解决访问目录名称中包含 @ 的路径的问题


WA=/perl/temp@23 (ENV PARAM)
if (defined $ENV{'WA'}) {
$ENV{'AC'} = "$ENV{'WA'}/right";
}
eval(qq|use lib "$ENV{'AC'}/lib"|);

错误 -- 在 (eval 1( 第 1 行的字符串中可能意外插入 @23。

我尝试了以下解决方案,但没有一个有很大帮助。

尝试 1:不起作用

$ENV{'WA'} =~ s/(^.*)@(.*)/$1@$2/;
if (defined $ENV{'WA'}) {
$ENV{'AC'} = "$ENV{'WA'}/right";
}
eval(qq|use lib "$ENV{'AC'}/lib"|);

我看到了另一个问题。 当它工作一次时..不知道它为什么以及如何工作,但库没有添加到@INC路径中。

尝试 2:不起作用 - 我在一篇文章中看到 \x40 代表 @

$ENV{'WA'} =~ s/(^.*)@(.*)/$1x40$2/;
if (defined $ENV{'WA'}) {
$ENV{'AC'} = "$ENV{'WA'}/right";
}
eval(qq|use lib "$ENV{'AC'}/lib"|);

尝试 3:一个错误到下一个错误

$ENV{'WA'} =~ s/(^.*)(@)(.*)/$1@$3/;
if (defined $ENV{'WA'}) {
$ENV{'AC'} = "$ENV{'WA'}/right";
}
my $str = $ENV{'AC'};
eval(qq|use lib "$str/lib"|);
use module

错误:在@INC中找不到模块 至少现在我不会得到意外的插值@

有人可以给我一些关于如何解决这个问题的指示。

为什么需要字符串 eval?

BEGIN {
if (defined $ENV{WA}) {
$ENV{AC} = "$ENV{WA}/right";
}
}
use lib "$ENV{AC}/lib";

或者,如果只想在定义了 AC 的情况下设置@INC:

use if defined $ENV{AC},
lib => do { no warnings 'uninitialized'; "$ENV{AC}/lib" };
use lib
defined($ENV{WA}) ? "$ENV{WA}/right/lib"
: defined($ENV{AC}) ? "$ENV{AC}/lib"
: ();

use lib
defined($ENV{WA}) ? "$ENV{WA}/right/lib" : (),
defined($ENV{AC}) ? "$ENV{AC}/lib"       : ();

最新更新