Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何解决访问目录名中包含@的路径的问题_Perl_Path - Fatal编程技术网

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

Perl 如何解决访问目录名中包含@的路径的问题,perl,path,Perl,Path,错误--在(eval 1)第1行的字符串中可能意外插入@23 我尝试了以下解决方案,但没有一个对我有很大帮助 尝试1:不起作用 WA=/perl/temp@23 (ENV PARAM) if (defined $ENV{'WA'}) { $ENV{'AC'} = "$ENV{'WA'}/right"; } eval(qq|use lib "$ENV{'AC'}/lib"|); 我看到了另一个问题。 当它工作一次时..不知道它为什么工作以及如何工作,但l

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

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

尝试1:不起作用

WA=/perl/temp@23 (ENV PARAM)

    if (defined $ENV{'WA'}) {
        $ENV{'AC'} = "$ENV{'WA'}/right";
    }
    eval(qq|use lib "$ENV{'AC'}/lib"|);
我看到了另一个问题。 当它工作一次时..不知道它为什么工作以及如何工作,但lib没有添加到@INC path

尝试2:无效-我在帖子中看到\x40代表@

$ENV{'WA'} =~ s/(^.*)@(.*)/$1\@$2/;
if (defined $ENV{'WA'}) {
    $ENV{'AC'} = "$ENV{'WA'}/right";
}
eval(qq|use lib "$ENV{'AC'}/lib"|);
尝试3:一个错误切换到下一个错误

$ENV{'WA'} =~ s/(^.*)@(.*)/$1\x40$2/;
if (defined $ENV{'WA'}) {
    $ENV{'AC'} = "$ENV{'WA'}/right";
}
eval(qq|use lib "$ENV{'AC'}/lib"|);
错误:在@INC中找不到模块 至少现在我没有意外的插值@


有人能给我一些关于如何解决这个问题的建议吗。

为什么需要字符串eval

$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
或者,如果只想在定义了AC的情况下设置@INC:

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

use lib "$ENV{AC}/lib";


如果您完全逃过了
s/@/\\@/g
,尝试1将起作用。谢谢Chris,由于您提到的更改,我遇到了尝试3中提到的问题。找不到该模块in@INC.eval语句应该包括模块的@INC中的路径。可能值得打印出您试图添加的内容和/或
@INC
的内容,以确保您添加了正确的路径
use
是一个编译时语句。您的
use module
语句将在您的
eval(qq | use lib…|)
语句之前进行评估,因此您的
use lib…
没有任何好处。删除eval似乎可行,但现在我又回到了原点。无法在@INC中找到模块。奇怪的是,我打印的路径…似乎将工作区作为临时区域,而不是临时区域temp@23它实际上有module@ikegami:出现警告,因为即使
if
条件为false,也会计算参数。@ikegami:没问题:-)
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"       : ();