Невозможно найти локальный файл в @INC, не CPANable - PullRequest
0 голосов
/ 03 июля 2018

Я сейчас пытаюсь загрузить программу, которая доставила мне много проблем. Я использую Cygwin в Windows. Программа должна работать правильно, и все установочные пакеты были установлены в оболочке терминала администратора, и поскольку программа не была обработана, ошибок не возникало. Однако после установки программа не может найти модуль @INC с именем FASTA в файловой системе

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;

Я работаю над этой проблемой уже пару дней, и это большое узкое место для других частей моей программы. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

@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";
0 голосов
/ 03 июля 2018

Вас сбивают с толку правила интерполяции цитат в Perl. Внутри одинарных кавычек символ обратной косой черты действует только как «escape», когда за ним следует одинарная кавычка или другая обратная косая черта. Во всех остальных случаях это интерпретируется как буквальная обратная косая черта.

Если вы распечатаете $ENV{SIGNAL}, вы увидите что-то вроде

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

включая символ обратной косой черты. Не уходи из космоса, и с тобой все будет в порядке.

BEGIN {
    $ENV{SIGNAL} = 
        '/cygdrive/c/Users/rpbas/Documents/Work/Olivera Lab/signal-4.1';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...