Forum Webscript.Ru

Программирование => Perl => Тема начата: xmolex от 21 Ноября 2006, 18:23:29

Название: Параметр T и LWP::Simple
Отправлено: xmolex от 21 Ноября 2006, 18:23:29
Приветсвую. Возможно ли как-то обойти ограничение? LWP::Simple скрипт нормально подгружает, а вот LWP/Simple.pm сам пытается подгрузить IO/Socket.pm и не может. Почему, ведь в @INC прописаны пути D:/usr/lib и D:/usr/site/lib? Может я что-то не понятно спросил? Вы тогда переспросите. Уж очень интересно. Может в @INC нужно полный путь до модуля прописать?

Вот лог сервера:
[Tue Nov 21 18:04:57 2006] [error] [client 127.0.0.1] Can\'t locate IO/Socket.pm in @INC (@INC contains: D:/usr/lib/LWP/Simple.pm D:/usr/site/lib/LWP/Simple.pm) at D:/usr/site/lib/LWP/Simple.pm line 160, line 8.
Название: Параметр T и LWP::Simple
Отправлено: NeoNox от 21 Ноября 2006, 18:44:27
А при чем тут "Параметр T"?
Нужен полный путь к папке с модулями, и глядя на ошибку, я вижу что у вас что-то не то лежит в @INС
Название: Параметр T и LWP::Simple
Отправлено: xmolex от 21 Ноября 2006, 19:00:38
Параметр Т - это #!/usr/bin/perl -wT
Я читал что он не включает домашнюю директорию в окружение. И вот попробовал воспользоваться LWP::Simple, вернее get и получил такое.
Название: Параметр T и LWP::Simple
Отправлено: NeoNox от 21 Ноября 2006, 19:11:27
perldoc perlsec
Цитировать
While in this mode, Perl takes special precautions called
       taint checks to prevent both obvious and subtle traps.
       Some of these checks are reasonably simple, such as veriґ
       fying that path directories aren\'t writable by others;
       careful programmers have always used checks like these.
       Other checks, however, are best supported by the language
       itself, and it is these checks especially that contribute
       to making a set-id Perl program more secure than the corґ
       responding C program.

Что такое "домашняя директория"? Без ключа -Т работает нормально?
Название: Параметр T и LWP::Simple
Отправлено: xmolex от 22 Ноября 2006, 12:37:50
Спасибо NeoNox. Все самой решилось. Это сервер приглючило после моих опытов. Перезагрузил apache и все встало на свое место.
Хотелось бы еще спросить. Делаю проверку на наличие этого модуля. Сделал нижеприведенным образом. Криво или можно как-то проще? Просто, если человек не имеет этого модуля хочется чтобы программа нормально дальше работала, а не выводила 500 ошибку. Только хочется, чтобы без модулей, не входящих в стандартную поставку перла, было.


sub http_get
{
  my ($text,$road) = @_; #text - наш текст, который мы проверяем на link, road - путь к корневой директории сайта
  my ($temp, $temp_inc, $flag);
  my $bee_split = chr(128);

  if ($text =~ /(<\\!--\\*\\s*http\\s*-->.+?<\\!--\\*\\s*\\/http\\s*-->)/i)
   {
     foreach $temp (@INC)
      {
        $temp_inc = $temp;
        if ($temp_inc !~ /\\/$/) {$temp_inc .= "/";}
        $temp_inc .= "LWP/Simple.pm";
        if (-f $temp_inc) {$flag = 1;}
      }
     if ($flag != 1)
      {
        my $lng_file = ${\\LNG_FILE}; # LNG_FILE - название файла с русским текстом
        if ($lng_file =~ /^\\//) {$lng_file =~ s!^/!!;}
        my $road_lng = $road; $road_lng .= $lng_file;
        open (LNG, "$road_lng") || warn "don\'t open lng file: $!";
        foreach () {chomp(); $temp .= $_;}
        close(LNG);
        @lng = split(/$bee_split/, $temp);
        &log($lng[3], $road);
        $text =~ s/(<\\!--\\*\\s*http\\s*-->)(.+?)(<\\!--\\*\\s*\\/http\\s*-->)//i;
      }
     else
      {
        use LWP::Simple qw(get);
        while ($text =~ /(<\\!--\\*\\s*http\\s*-->)(.+?)(<\\!--\\*\\s*\\/http\\s*-->)/ig)
         {
           $flag = get("$2");
           $text =~ s/<\\!--\\*\\s*http\\s*-->.+?<\\!--\\*\\s*\\/http\\s*-->/$flag/i;
         }
        $text =~ s/\\n/$bee_split/g;
      }
   }
  return($text);
}
Название: Параметр T и LWP::Simple
Отправлено: NeoNox от 22 Ноября 2006, 23:28:20
Можно,
http://forums.webscript.ru/showthread.php?s=&threadid=23168&highlight=evaluse
Название: Параметр T и LWP::Simple
Отправлено: xmolex от 23 Ноября 2006, 10:33:28
Премного благодарен.