PERL 모듈을 사용하기 전에 어떻게 확인할 수 있습니까?
문제
의존하는 다음 Perl 코드가 있습니다 Term::ReadKey
터미널 너비를 얻기 위해; NetBSD 빌드 에이 모듈이 없으므로 모듈이 없으면 터미널의 너비를 기본값으로 기본적으로 기본적으로 원합니다.
모듈을 조건부로 사용하는 방법을 알 수 없으며, 사용할 수 있는지 미리 알 수 없습니다. 내 현재 구현은 찾을 수 없다는 메시지로 그만 두었습니다. Term::ReadKey
결석 한 경우.
#/usr/pkg/bin/perl -w
# Try loading Term::ReadKey
use Term::ReadKey;
my ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
my @p=(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97);
my $plen=$#p+1;
printf("num |".("%".int(($wchar-5)/$plen)."d") x $plen."\n",@p);
NETBSD에서는 Perl 5.8.7, Cygwin에서 5.8.8을 사용하고 있습니다. 이것을 내 스크립트에보다 효과적으로 구현할 수 있도록 도와 주시겠습니까?
해결책
다음은 다른 모듈이 필요하지 않은 베어 본 솔루션입니다.
my $rc = eval
{
require Term::ReadKey;
Term::ReadKey->import();
1;
};
if($rc)
{
# Term::ReadKey loaded and imported successfully
...
}
아래의 모든 답변은 (이 답변이 아래에 있기를 바랍니다! :-) 그 사용에 주목하십시오. eval { use SomeModule }
틀 렸습니다 use
진술은 코드가 나타나는 위치에 관계없이 컴파일 시간에 평가됩니다. 그래서 만약 SomeModule
사용할 수 없습니다. 스크립트는 컴파일되면 즉시 죽습니다.
(문자열 평가 a use
성명서도 작동합니다 (eval 'use SomeModule';
), 그러나 런타임에 새 코드를 구문 분석하고 컴파일하는 의미는 없습니다. require
/import
페어는 똑같은 일을하고 컴파일 시간에 부팅 할 때 구문 확인됩니다.)
마지막으로, 내 사용에 주목하십시오 eval { ... }
그리고 $@
이 예제의 목적을위한 간결합니다. 실제 코드에서는 같은 것을 사용해야합니다 시도 :: 작은, 아니면 적어도 문제가 해결되는 문제를 알고 있어야합니다.
다른 팁
CPAN 모듈을 확인하십시오 모듈 ::로드 :: 조건부. 그것은 당신이 원하는 것을 할 것입니다.
고전적인 대답 (최소한 '사용'이 있기 훨씬 전에 Perl 4로 거슬러 올라가는 것은 'require ()'모듈이었습니다. 이것은 컴파일 된시기보다는 스크립트가 실행되면 실행되며 성공 또는 실패를 테스트하고 적절하게 반응 할 수 있습니다.
모듈의 특정 버전이 필요한 경우 :
my $GOT_READKEY;
BEGIN {
eval {
require Term::ReadKey;
Term::ReadKey->import();
$GOT_READKEY = 1 if $Term::ReadKey::VERSION >= 2.30;
};
}
# elsewhere in the code
if ($GOT_READKEY) {
# ...
}
if (eval {require Term::ReadKey;1;} ne 1) {
# if module can't load
} else {
Term::ReadKey->import();
}
또는
if (eval {require Term::ReadKey;1;}) {
#module loaded
Term::ReadKey->import();
}
참고 : 1;
경우에만 실행됩니다 require Term::...
제대로로드 됨.
변수를 사용할 때는 작동하지 않는다고 생각합니다. 확인해주십시오 이 링크 변수와 함께 사용할 수있는 방법을 설명합니다
$class = 'Foo::Bar';
require $class; # $class is not a bareword
#or
require "Foo::Bar"; # not a bareword because of the ""
요구 함수는 @inc 배열에서 "foo :: bar"파일을 찾아서 "foo :: bar"를 찾지 않는 것에 대해 불평합니다. 이 경우 할 수 있습니다.
eval "require $class";