명령 줄에서 Perl 모듈이 시스템에 설치되어 있는지 어떻게 확인할 수 있습니까?
내 시스템에 XML :: Simple이 설치되어 있는지 확인하려고했습니다.
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
위의 한 줄은 내 시스템에 설치된 모든 모듈을 나열하는 데 사용되었습니다. 그러나 XML 모듈을 나열하지 않습니다.
그러나 다음은 정상적으로 실행됩니다.
perl -e "use XML::Simple "
무엇이 문제일까요?
다음을 통해 모듈의 설치 경로를 확인할 수 있습니다.
perldoc -l XML::Simple
한 줄짜리 문제는 디렉토리 / 하위 디렉토리를 재귀 적으로 순회하지 않는다는 것입니다. 따라서 실용적인 모듈 이름 만 출력으로 얻습니다.
빠르고 더러운 :
$ perl -MXML::Simple -e 1
$ perl -MXML :: Simple -le 'print $ INC { "XML / Simple.pm"}'
- % INC
해시는
%INC비아 포함 된 각 파일 이름에 대한 항목을 포함do,require또는use운영자. 키는 지정한 파일 이름 (모듈 이름이 경로 이름으로 변환 됨)이고 값은 찾은 파일의 위치입니다.require연산자는 특정 파일이 이미 포함되었는지 여부를 확인하기 위해 해시를 사용합니다.파일이 후크를 통해로드 된 경우 (예 : 서브 루틴 참조, 이러한 후크에 대한 설명 은 require 참조 ),이 후크는 기본적
%INC으로 파일 이름 대신에 삽입됩니다 . 그러나 후크는보다 구체적인 정보를 제공하기 위해 자체적으로 % INC 항목을 설정했을 수 있습니다.
예를 들어 DBI 모듈이 설치되어 있는지 확인하려면
perl -e 'use DBI;'
설치되지 않은 경우 오류가 표시됩니다. ( http://www.linuxask.com에서 )
당신이하고있는 일은 디렉토리로 반복되지 않습니다. 디렉토리의 루트 디렉토리에있는 모듈 만 나열합니다 @INC.
모듈 XML::Simple은 @INC아래 의 경로 중 하나에 XML/Simple.pm있습니다.
특정 모듈을 찾기 위해 위에서 말한 것.
CPAN여기에서 모든 모듈을 찾는 방법에 대해 설명합니다 . 설치된 모듈을 찾는 방법을 참조하십시오 .
모듈이 설치되었는지 빠르게 확인하려면 (최소한 Unix 시스템에서 Bash 를 쉘로 사용) 다음을 .bashrc 파일에 추가하십시오.
alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"
그런 다음 다음을 수행 할 수 있습니다.
=> modver XML::Simple
No module found
=> modver DBI
Version 1.607
while (<@ INC>)
이것은 @INC의 경로를 공백으로 구분 된 문자열로 결합한 다음 문자열에서 glob ()을 호출 한 다음 공백으로 구분 된 구성 요소를 반복합니다 (파일 글 로빙 메타 문자가없는 경우).
@INC에 공백, \, [], {}, *,? 또는 ~가 포함 된 경로가 있고 안전한 대안을 피할 이유가없는 경우에는 제대로 작동하지 않습니다.
for (@INC)
Windows 에서 ActivePerl 을 실행하는 경우 :
C:\>ppm query *설치된 모든 모듈 목록을 얻으려면C:\>ppm query XML-SimpleXML::Simple설치되어 있는지 확인하려면
귀하의 솔루션은 @INC 배열에 포함 된 각 디렉토리 경로의 루트에서만 찾습니다. 다음과 같은 재귀적인 것이 필요합니다.
perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'
@ user80168의 솔루션에 대한 Bravo (나는 여전히 \'s!)하지만 별칭 및 셸과 관련된 모든 이스케이프를 피하기 위해 :
%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; }
? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" )
: print "Not installed" ' $1
합리적으로 잘 작동합니다.
다음을 사용하는 가장 간단하고 "현대적인"접근 방식이 있습니다 Module::Runtime.
perl -MModule::Runtime=use_module -E '
say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI
모듈이 설치되지 않은 경우 유용한 오류가 발생합니다.
Using -MModule::Runtime requires it to be installed (it is not a core module).
ReferenceURL : https://stackoverflow.com/questions/1039107/how-can-i-check-if-a-perl-module-is-installed-on-my-system-from-the-command-line
'Development Tip' 카테고리의 다른 글
| C # RSA 암호화 / 복호화 (전송 포함) (0) | 2020.12.26 |
|---|---|
| Android 재정의 onBackPressed () (0) | 2020.12.26 |
| SFTP를 통해 파일을 전송할 때 FTP보다 시간이 오래 걸리는 이유는 무엇입니까? (0) | 2020.12.26 |
| 열 이름이 주어지면 R의 열 번호를 가져옵니다. (0) | 2020.12.26 |
| DOCTYPE 선언 전에 주석이 나타날 수 있습니까? (0) | 2020.12.26 |