문제

의존하는 다음 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";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top