Forum Webscript.Ru

Программирование => Perl => Тема начата: lalex от 07 Июня 2002, 19:05:14

Название: Подключенные модули
Отправлено: lalex от 07 Июня 2002, 19:05:14
Люди подскажите, как в скрипте узнать подключен ли заданный модуль и как узнать имена объектов(если они имеются) этого класса.
Название: Подключенные модули
Отправлено: YA от 08 Июня 2002, 01:56:14
use МОДУЛЬ;
или
use МОДУЛЬ ВЕРСИЯ;

Если модуль отсутствует или его версия меньше указанной, интерпретатор выдаст сообщение об ошибке.
Название: Подключенные модули
Отправлено: Chs от 10 Июня 2002, 10:19:37
Цитировать

use МОДУЛЬ;
или
use МОДУЛЬ ВЕРСИЯ;

eval {
use МОДУЛЬ;
или
use МОДУЛЬ ВЕРСИЯ;
};
warn $@ if $@;
Название: Подключенные модули
Отправлено: от 10 Июня 2002, 12:19:29
#!/usr/bin/perl

use strict;
use warnings;
use DBI;

if (%DBI::) {
  print "DBI is loaded\\n";
  foreach (sort keys %DBI::) {
    print $_ . "\\n"
  }
} else {
  print "DBI doesn\'t loaded\\n";
}

Вообщем по-русски хэш %МОДУЛЬ:: содержит методы, имена переменных и все такое модуля МОДУЛЬ. Если этот хэш определен, значит модуль загружен. Очень кстати прикольная штука динамическое ООП получается.
Название: Подключенные модули
Отправлено: NeoNox от 10 Июня 2002, 12:44:45
Unregistered вот эта ветка в твоем скрипте
Цитировать
else {
print "DBI doesn\'t loaded\\n";
}

абсолютно не нужна. ;)
Если модуль не установлен, то вывалится ошибка уже при use DBI;
Название: Подключенные модули
Отправлено: от 10 Июня 2002, 13:04:36
Как-это не нужна??? Человек спросил можно ли узнать подключен модуль в скрипте??? А не то что установлен ли модуль вообще на машине. Если надо узнать если такой модуль на машине , то ,например, eval {require МОДУЛь} or die \'Sorry...\'.

А про DBI я просто для примера написал. Вот общий случай:

no strict \'refs\';
foreach (qw(Модуль Модуль2 Модуль3)) {
my $module = $_ . \'::\';
if ( %{$module} ) {
print $_ . " is loaded\\n"
} else {
print $_ . " doesn\'t loaded\\n"
}
}
use strict \'refs\';
Название: Подключенные модули
Отправлено: NeoNox от 10 Июня 2002, 13:10:37
Цитировать
Человек спросил можно ли узнать подключен модуль в скрипте???

;) Даже спорить не буду... Подумал что lalex спрашивал о подключенных модулях в системе...
Название: Подключенные модули
Отправлено: от 10 Июня 2002, 13:30:56
Кстати для Chs.
Твой пример работать не будет. Так как use рассматривается во время компиляции, а eval {} рассматривается во время исполнения. Надо использовать eval "" так как с кавычками как раз рассматриватеся во время компиляции что и надо.
Название: Подключенные модули
Отправлено: Chs от 10 Июня 2002, 13:41:53
Цитировать
Кстати для Chs.
Твой пример работать не будет. Так как use рассматривается во время компиляции, а eval {} рассматривается во время исполнения. Надо использовать eval "" так как с кавычками как раз рассматриватеся во время компиляции что и надо.

Прав. Только все наоборот.:)
Название: Подключенные модули
Отправлено: от 10 Июня 2002, 14:17:24
В смысле наоборот??????
eval{use Not::Module;} при компиляции use Not::Module вызовет ошибку, так как eval {...} будет работать во время исполнения.
eval "use Not::Module" ошибке не вызовет так как во время компиляции будет рассмотрен eval "..." и соответсвенно ошибка будет правильно обработана.
Название: Подключенные модули
Отправлено: Chs от 10 Июня 2002, 14:46:15
Цитировать
а eval {} рассматривается во время исполнения.

Цитировать
eval{use Not::Module;} при компиляции use Not::Module вызовет ошибку

:))
Название: Подключенные модули
Отправлено: от 10 Июня 2002, 14:53:21
Ну все правильно. eval {..} будет работать во время исполнения, в то время как use во время компиляции. Так что произойдет ошибка раньше, чем eval смог бы ее перехватить.
Название: Подключенные модули
Отправлено: Chs от 10 Июня 2002, 15:02:45
Цитировать
Ну все правильно.

"Ну" неправильно. Анализ внутренностей eval {} идет на этапе комиляции, а eval ""; на этапе выполнения. А теперь еще раз медленно и внимательно прочитай все свои постинги в данном треде.
Название: Подключенные модули
Отправлено: от 10 Июня 2002, 15:19:19
# a compile-time error
eval { $answer = };                 # WRONG

# a run-time error
eval \'$answer =\';   # sets $@

Признаю свою ошибку.