ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: inline sub в perl_set ч то-то не хочет работать



On Mon, 13 Mar 2006, Alexey Polyakov wrote:

Попробовал я запустить перл, с примерами из документации.
Если делаю perl_set $var hello::handler, то отрабатывает как и ожидалось.
А если perl_set $var ' sub {....} ';, то ругается в error log:

2006/03/12 14:48:52 [error] 23133#0: *1 call_sv("

       sub {
           my $r = shift;
           my $ua = $r->header_in("User-Agent");

           return "O" if $ua =~ /Opera/;
           return "1" if $ua =~ / MSIE [6-9]\.\d+/;
           return "Z";
       }

   ") failed: "Undefined subroutine &main::

       sub {
           my $r = shift;
           my $ua = $r->header_in("User-Agent");

           return "O" if $ua =~ /Opera/;
           return "1" if $ua =~ / MSIE [6-9]\.\d+/;
           return "Z";
       }

    called." while closing request, client: ...., server: localhost,
URL: "/", host: "...."

Прилагаемый патч решает проблему.


Игорь Сысоев
http://sysoev.ru
--- src/http/modules/perl/ngx_http_perl_module.c        Sun Mar  5 23:15:50 2006
+++ src/http/modules/perl/ngx_http_perl_module.c        Mon Mar 13 13:46:56 2006
@@ -692,10 +692,18 @@
 static void
 ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv)
 {
-    if (ngx_strncmp(handler->data, "sub ", 4) == 0
-        || ngx_strncmp(handler->data, "use ", 4) == 0)
+    u_char  *p;
+
+    for (p = handler->data; *p; p++) {
+        if (*p != ' ' && *p != '\t' && *p != CR && *p != LF) {
+            break;
+        }
+    }
+
+    if (ngx_strncmp(p, "sub ", 4) == 0
+        || ngx_strncmp(p, "use ", 4) == 0)
     {
-        *sv = eval_pv((char *) handler->data, FALSE);
+        *sv = eval_pv((char *) p, FALSE);
 
         return;
     }


 




Copyright © Lexa Software, 1996-2009.