почему perl Module :: Load :: Conditional :: check_install находит неустановленный модуль? - PullRequest
0 голосов
/ 18 марта 2020

-> perl -v Это perl 5, версия 24, subversion 0 (v5.24.0), созданная для x86_64- linux

Я пытаюсь условно загрузить * Модуль 1013 *, если он установлен с использованием ...

#!/usr/bin/env perl
use strict;                                                                                                                                                                                                                                                                              
use Module::Load::Conditional qw[can_load check_install requires];                                                                                                                                                                                                                       

if(check_install( module => 'dvm_common')) {                                                                                                                                                                                                                                             
    use dvm_common;
    print "Looks like dvm_common is installed, so it was loaded.\n";
} else {
    print "Looks like dvm_common is not installed.\n";
}

exit;

Не компилируется, жалуется на отсутствующий модуль ...

--> perl -c ./mod_load_cond_test.pl
Can't locate dvm_common.pm in @INC (you may need to install the dvm_common module) (@INC contains: etc...  .) at ./mod_load_cond_test.pl line 6.
BEGIN failed--compilation aborted at ./mod_load_cond_test.pl line 6.

Я думал, что весь смысл использования этого заключается в проверить наличие модуля перед его загрузкой?

1 Ответ

2 голосов
/ 18 марта 2020

use является оператором времени компиляции, поэтому интерпретатор немедленно загружает модуль, когда он проходит через источник, и встречает оператор use, как если бы вы написали

 BEGIN { require Module; Module->import }

Чтобы загрузить модуль во время выполнения, вы можете использовать require

if(check_install( module => 'dvm_common')) {                                                                                                                                                                                                                                             
    require dvm_common;
    dvm_common->can("import") && dvm_common->import;   # optional
    ...

или строку eval:

if(check_install( module => 'dvm_common')) {                                                                                                                                                                                                                                             
    eval "use dvm_common;1" or die $@;
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...