Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поймать исключение  (Прочитано 11346 раз)
0 Пользователей и 1 Гость смотрят эту тему.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« : 19-08-2008 06:55 » 

Всем привет. Суть вопроса: у меня есть несколько десятков перловых скриптов, которым нужны установленные перловые модули. Что бы каждый раз самому не ставить эти модули и не хранить где список этих модулей я решил отлавливать тот момент когда скрипт завершается с ошибкой о не найденном какой то перловом модуле.

С помощью Ромки, получилась вот такая конструкция:

Код:
cat /etc/perl/test1.pm

#!/usr/bin/perl

eval
{
     require $_;
};

open(STDERR, "> logfile.log") or die "Error, i'm can't open log file...";

if($@)
{
    $@ = ~m/"^Can't locate ([^.]+)pm in @INC"/;

    print STDERR "Module '$1' is absent!\n";

    print "FUCK, $@\n"; //это для теста ниже виден результат.

    exec 'perl -MCPAN -e \'install "$mod_name"\'';
}

close(LOGFILE);
return 1;

Код:
 cat test2.pl

#!/usr/bin/perl

use test1;
#use Navigator;
use Logging;

print "FUCK YOU MAMONT";

выполняем:

Код:
sudo perl test2.pl

FUCK, 4294967295
CPAN: Storable loaded ok
Going to read /home/mczim/.cpan/Metadata
  Database was generated on Mon, 18 Aug 2008 01:02:45 GMT
Warning: Cannot install , don't know what it is.
Try the command

    i //

to find objects with matching identifiers.

FUCK, 4294967295 --вот это расположено в $@ очень странно, тут должна храниться ошибка.

В общем чего я хочу? Я хочу в переменной $@ отловить ошибку, выбрать из нее название модуля и запустить установку оного.
« Последнее редактирование: 19-08-2008 07:23 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 19-08-2008 07:24 » 

так, если сделать вот так то все нормально в $@ есть нужная ошибка.

Код:
cat /etc/perl/test1.pm

#!/usr/bin/perl

eval
{
     require '/home/mczim/main/perl/test2.pl';
};

#open(STDERR, "> logfile.log") or die "Error, i'm can't open log file...";

if($@)
{
#    $@ = ~m/"^Can't locate ([^.]+)pm in @INC"/cgimosx;

#    print STDERR "Module '$1' is absent!\n";
    print "FUCK, $@\n";

#    exec 'perl -MCPAN -e \'install "$1"\'';
}

#close(LOGFILE);

т.е. вот это:

Код:
eval
{
     require $_;
};

заменил на это:

Код:
eval
{
     require '/home/mczim/main/perl/test2.pl';
};

хм, но мне не нужно знать какое имя у файла, мне нужно получаться любое имя на вход. За это как раз отвечает переменная $_, как быть?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #2 : 19-08-2008 07:31 » 

так выяснил, что вот это:

Код:
eval
{
     require $_;
};

совершенно тут не причем,

проблема вот в этой строке:

Код:
$@ = ~m/"^Can't locate ([^.]+)pm in @INC"/;

разбираюсь...
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 19-08-2008 07:53 » 

Имя модуля я вынимаю, пока что из указанного файла:

Код:
 cat test1.pm

#!/usr/bin/perl

eval
{
     require '/home/mczim/main/perl/test2.pl';
};

#open(STDERR, "> logfile.log") or die "Error, i'm can't open log file...";

if($@)
{
    ($tmp) = split(/in \@INC/, $@);
    ($a,$b,$mod_name) = split(/ /, $tmp);
    print "$mod_name\n";
    print "\n";

    exec 'perl -MCPAN -e \'install "$mod_name"\'';
}

#close(LOGFILE);
return 1;

ну и на этом пожалуй остановимся, потому как по найденному имени модуля не получится установить его, сами исходники могут называться совершенно по другому, как-то я это упустил из виду.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 19-08-2008 12:03 » new

+ еще один важный момент, почему ненужно делать то что я хотел реализовать. Это то что при инсталяции некоторых модулей, происходит общение с админом, т.е. интерактивная установка.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines