无法在@INC 中找到本地文件,不是 CPANable

Unable to locate local file in @INC, not CPANable

我目前正在尝试下载一个给我带来很多问题的程序。我 运行 在 Windows 上使用 cygwin。该程序应该 运行 正确并且安装包都已安装在管理员终端 shell 中,并且由于程序被取消'tar' 没有抛出任何错误。但是安装后程序无法在文件系统中找到名为 FASTA 的@INC 模块

rpbas@DESKTOP-4LMFDCK /cygdrive/c/Users/rpbas/Documents/Work/OliveraLab/signal-4.1 
$ ./signal -t euk -f short test/euk10.fsa > euk10.fsa.short_out Can't locate FASTA.pm in @INC (you may need to install the FASTA module) 
(@INC contains: 
/cygdrive/c/Users/rpbas/Documents/Work/Olivera\ Lab/signal-4.1/lib 
\cygdrive\c\Users\rpbas\Documents\Work\Olivera/ Lab\signal-4.1 
/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads 
/usr/local/share/perl5/site_perl/5.26 /usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads 
/usr/share/perl5/vendor_perl/5.26 
/usr/lib/perl5/5.26/x86_64-cygwin-threads /usr/share/perl5/5.26) 
at ./signal line 60. 
BEGIN failed-- compilation aborted at ./signal line 60.

但是,./lib/FASTA.pm 文件显然存在并且被定向到。

rpbas@DESKTOP-4LMFDCK /cygdrive/c/Users/rpbas/Documents/Work/Olivera\ Lab/signal-4.1/lib
$ ls
FASTA.pm

代码包括行(开头)

BEGIN {
$ENV{SIGNAL} = '/cygdrive/c/Users/rpbas/Documents/Work/Olivera\ Lab/signal-4.1';
}

第 60 行

use lib "$ENV{SIGNAL}/lib";
use FASTA;

我已经在这个问题上工作了几天,这对我程序的其他部分来说是一个很大的瓶颈。如有任何帮助,我们将不胜感激!

您被 Perl 的引用插值规则给绊倒了。在单引号内,反斜杠字符仅在其后跟单引号或另一个反斜杠时充当 "escape" 字符。在所有其他情况下,它被解释为文字反斜杠。

如果你打印出来$ENV{SIGNAL}你会看到类似

的东西
/cygdrive/c/Users/rpbas/Documents/Work/Olivera\ Lab/signal-4.1

包括反斜杠字符。不要逃避space,你应该没问题。

BEGIN {
    $ENV{SIGNAL} = 
        '/cygdrive/c/Users/rpbas/Documents/Work/Olivera Lab/signal-4.1';
}

@INC 包含

/cygdrive/c/Users/rpbas/Documents/Work/Olivera\ Lab/signal-4.1/lib

什么时候应该包含

/cygdrive/c/Users/rpbas/Documents/Work/Olivera Lab/signal-4.1/lib

你可以替换

BEGIN {
  $ENV{SIGNAL} = '/cygdrive/c/Users/rpbas/Documents/Work/Olivera\ Lab/signal-4.1';
}

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

BEGIN {
  $ENV{SIGNAL} = '/cygdrive/c/Users/rpbas/Documents/Work/Olivera Lab/signal-4.1';
}

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

但更好的解决方案是将其替换为

use FindBin qw( $RealBin );
use lib ( $ENV{SIGNAL} || $RealBin ) . "/lib";