Isso pode ser devido a um problema da Apple, o homebrew incorretamente alterando @INC
de tal forma que o fornecedor fornecido /usr/bin/perl
esteja atendendo a essas alterações ou algum erro do usuário. @INC
é uma lista de caminhos onde perl
procura por módulos, então
% perl -E 'say for @INC'
/Users/jhqdoe/perl5/lib/perl5/darwin-thread-multi-2level
/Users/jhqdoe/perl5/lib/perl5
/opt/local/lib/perl5/site_perl/5.26/darwin-thread-multi-2level
/opt/local/lib/perl5/site_perl/5.26
...
Ooops é a versão do MacPorts que eu tenho primeiro em PATH
então
% /usr/bin/perl -E 'say for @INC'
/Users/jhqdoe/perl5/lib/perl5/darwin-thread-multi-2level
/Users/jhqdoe/perl5/lib/perl5
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
...
Esses dois primeiros caminhos são de local::lib
que outras configurações podem ou não ter. Independentemente, para cada um desses diretórios, precisamos procurar por problemas de permissões, pois essa é a mensagem de erro. Isso pode ser problemático se as coisas já estiverem quebradas, então você não pode executar perl
para ver o que o @INC
contém. Ok, hora de quebrar meu sistema.
% chmod 000 /Users/jhqdoe/perl5/lib/perl5
% perl -E 'say for @INC'
Can't locate feature.pm: /Users/jhqdoe/perl5/lib/perl5/feature.pm: Permission denied.
BEGIN failed--compilation aborted.
formulários mais antigos que não carregam módulos (como feature.pm
) podem ajudar, ou executar perl -V
ou executar perl
em uma instalação não quebrada e, em seguida, inspecionar esses caminhos no sistema corrompido. Aqui podemos usar uma forma de código mais antiga para obter a lista de caminhos:
% perl -le 'print for @INC' | while read d; do ls -ld -- "$d"; done
d--------- 111 jhqdoe nsd 3774 Jun 1 10:44 /Users/jhqdoe/perl5/lib/perl5
...
Esse erro é bastante óbvio. Em outros sistemas, talvez seja necessário inspecionar as permissões em cada diretório no caminho, pois alguém pode ter configurado incorretamente /
ou /Users
(e assim por diante) ou pode haver um problema sutil em que há permissões de grupo incorretas (e, por exemplo, grupos secundários não estão sendo aplicados) ou alguma ACL sofisticada do sistema de arquivos envolvida. Novamente, estes podem estar em qualquer diretório do caminho.
% chmod 750 /Users/jhqdoe/perl5/lib/perl5
Ok, vamos quebrar de outra forma. Eu quebrarei a instalação do MacPorts desta vez, pois a área da Apple pode ter restrições de segurança que impedem mudanças aleatórias (para melhor ou para pior).
% sudo chmod 000 "$(perl -Mstrict -E 'say $INC{"strict.pm"}')"
% perl -Mstrict -E 'say "borked?"'
Can't locate strict.pm: /opt/local/lib/perl5/5.26/strict.pm: Permission denied.
BEGIN failed--compilation aborted.
A solução é a mesma, observe todos os caminhos de diretório em @INC
e também o nome do módulo que perl
está tentando carregar (aqui, strict.pm
) e corrija quaisquer problemas de permissão. Pode haver vários erros. Talvez seja necessário usar um recurso de rastreamento do sistema ( dtrace
ou strace
no Linux) para ajudar a encontrar os caminhos do sistema de arquivos para os quais o perl
está olhando.
% sudo chmod 644 /opt/local/lib/perl5/5.26/strict.pm
Se strict.pm
não estiver presente, isso é um problema diferente e pode indicar que arquivos críticos foram excluídos ou a instalação foi de alguma forma defeituosa ou o disco rígido está falhando, ou você está em um sistema operacional estranho (como como RedHat Linux), onde perl
foi dividido em uma variedade de pacotes pelo fornecedor.