명령 줄에서 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-Simple
XML::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
'Programing' 카테고리의 다른 글
Windows cmd 인코딩 변경으로 인해 Python 충돌 발생 (0) | 2020.12.29 |
---|---|
비활성화 된 경우 Android 텍스트보기 색상이 변경되지 않습니다. (0) | 2020.12.29 |
SFTP를 통해 파일을 전송할 때 FTP보다 시간이 오래 걸리는 이유는 무엇입니까? (0) | 2020.12.28 |
열 이름이 주어지면 R의 열 번호를 가져옵니다. (0) | 2020.12.28 |
DOCTYPE 선언 전에 주석이 나타날 수 있습니까? (0) | 2020.12.28 |