/ / Não consigo localizar * .pm em INC - perl

Não é possível localizar * .pm em INC - perl

Eu sou um novato para Perl. Desculpe pela minha pergunta idiota.

Eu tenho um código como este:

bintest.pl
subfolder/sample.pl

E no sample.pl, alguns são definidos assim:

#!/usr/bin/perl
use lib ".";
use lib "..";
use bintest qw(:DEFAULT
$client_routine
);

No entanto, quando eu uso perl sample.pl no subfolder, Eu recebi este erro:

Can"t locate bintest.pm in @INC (@INC contains: .. . /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl) at sample.pl line 6.

Eu perdi alguma coisa? Alguém poderia me ajudar?

Respostas:

7 para resposta № 1

usar faz algo muito específico:

É exatamente equivalente a

BEGIN { require Module; Module->import( LIST ); }

exigir também faz algo muito específico:

Se EXPR for uma bareword, o require assumirá uma extensão ".pm" e substituirá "::" por "/" no nome do arquivo para você, para facilitar o carregamento de módulos padrão.

Então, quando você diz

use bintest ( .. );

perl primeiro tenta localizar bintest.pm em um dos diretórios em @INC (que agora também contém . e .. obrigado ao seu use lib afirmações).

Não pode encontrá-lo, porque o que você tem é bintest.pl.

Você poderia require "../bintest.pl"e, em seguida, invocar bintest->import( ... ) você mesmo em um BEGIN bloco, mas, estou assumindo que você não quer ir para lá.

Eu recomendo que você use uma estrutura de diretórios diferente:

  • $project_root/bin: Seus scripts moram aqui
  • $project_root/lib: Seu .pm arquivos moram aqui

Colocar em $project_root/lib/My/Bintest.pm o seguinte arquivo

package My::Bintest;

use strict;
use warnings;
use Exporter qw( import );

1;
__END__

Então, do seu script em $project_root/bin/script.pl, você pode fazer:

use FindBin qw( $RealBin );
use lib "$RealBin/../lib";
use My::Bintest qw( ... );

1 para resposta № 2

Você tem dois Perl programas chamado bintest.pl e sample.pl. Você não tem Perl módulos. A função use é usado para carregar módulos Perl. Quando use converte o nome do módulo que é dado a um nome de arquivo para procurar, uma das coisas que ele faz é acrescentar ".pm" ao nome.

Então, dado que você tem um programa (bintest.pl) e não um módulo (que seria chamado bintest.pm), não é de todo surpreendente que use não pode encontrá-lo.

A verdadeira questão é, claro, o que você pode fazer para corrigir esse problema? E é difícil responder sem muito mais informações. É possível que bintest deve ser um módulo e que alguém acabou de dar o nome errado - nesse caso, basta renomeá-lo. É possível que seja uma biblioteca Perl antiga - nesse caso, carregá-la com require ao invés de use pode muito bem trabalhar. Mas é igualmente possível que seja realmente um programa e você não deveria estar tentando usá-lo dessa maneira.

Sabendo mais sobre o código (de onde vem, como está documentado, o que parece), é impossível dar uma resposta definitiva.