Аккуратный трюк:
#! /usr/bin/env perl
use strict;
use warnings;
BEGIN {
our $moduleIsMissing;
eval {
require My::Module;
};
if ($@) {
$moduleIsMissing = 1;
}
}
if ($main::moduleIsMissing) {
print "Module is missing. I've got to do something about it!\n"
}
else {
print "Module is there. I'm fine!\n";
}
Я не доволен вещью $main::moduleIsMissing
, но я не нашел способ обойти это.
Если доступно My::Module
, оно загружено и все в порядке. В противном случае устанавливается флаг $main::moduleIsMissing
. Это позволяет вам проверить, был ли загружен модуль, и, если нет, предпринять уклончивое действие. Например, ваша программа будет использовать полужирный шрифт при печати текста, если модуль Term::Cap
доступен, но если нет, просто распечатает текст без полужирного шрифта.
Вернуться к вопросу: гораздо лучше сделать:
use lib "MyDir";
Вместо @INC
.
use lib
включает каталог во время компиляции. Таким образом, если бы у меня был модуль «Foo :: Bar» в каталоге «MyDir», я мог бы сделать это:
use lib qw(MyDir);
use Foo::Bar;
без жалоб на Perl. Если бы я сделал это:
push (@INC, qw(MyDir));
use Foo::Bar;;
Perl пожалуется, что не может найти мой модуль.