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 № 1usar 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.