Pergunta

Eu tenho o seguinte código Perl que se baseia em Term::ReadKey para obter a largura terminal; Meu construir NetBSD está faltando este módulo, assim que eu quero para o padrão da largura do terminal para 80 quando o módulo está faltando.

Eu não consigo descobrir como usar condicionalmente um módulo, sabendo de antemão se ele está disponível. Minha implementação atual, apenas encerra com uma mensagem dizendo que não pode encontrar Term::ReadKey se é ausente.

#/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);

Eu estou usando Perl 5.8.7 no NetBSD e 5.8.8 em CygWin Pode me ajudar a implementar isso em meu script de forma mais eficaz?

Foi útil?

Solução

Aqui está uma solução nu-ossos que não requer outro módulo:

my $rc = eval
{
  require Term::ReadKey;
  Term::ReadKey->import();
  1;
};

if($rc)
{
  # Term::ReadKey loaded and imported successfully
  ...
}

Note que todas as respostas abaixo (Espero que eles estejam abaixo de um presente! :-) que o uso eval { use SomeModule } estão errados, porque declarações use são avaliadas em tempo de compilação, independentemente de onde no código em que aparecem. Então, se SomeModule não está disponível, o script vai morrer imediatamente após a compilação.

(A eval sequência de uma declaração use também funcionará (eval 'use SomeModule';), mas não há nenhuma análise sentido e compilar novo código em tempo de execução quando o par require / import faz a mesma coisa, e é sintaxe verificados em tempo de compilação para arrancar .)

Finalmente, nota que o meu uso de eval { ... } e $@ aqui é sucinto para o propósito deste exemplo. No código real, você deve usar algo como Tente :: minúsculo , ou pelo menos < a href = "http://search.cpan.org/dist/Try-Tiny/lib/Try/Tiny.pm#BACKGROUND" rel = "noreferrer"> estar ciente das questões que aborda .

Outras dicas

Confira o CPAN módulo Module :: Load :: condicional . Ele vai fazer o que quiser.

A resposta clássica (que remonta a Perl 4, pelo menos, muito antes de existir uma 'utilização') era 'require ()' um módulo. Este é executado como o script é executado, ao invés de quando compilado, e você pode testar para o sucesso ou fracasso e reagir adequadamente.

E se você precisar de uma versão específica do módulo:

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();
}

ou

if  (eval {require Term::ReadKey;1;}) {
#module loaded
Term::ReadKey->import();
}

Nota:. A 1; só é executado caso require Term::... carregado corretamente

Eu acho que não funciona ao usar variáveis. Verifique este link que explica como ele pode ser usado com a variável

$class = 'Foo::Bar';
        require $class;       # $class is not a bareword
    #or
        require "Foo::Bar";   # not a bareword because of the ""

O exigem função irá procurar o arquivo "Foo :: Bar" na matriz @INC e irá queixar-se de não encontrar "Foo :: Bar" lá. Neste caso, você pode fazer:

 eval "require $class";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top