+ -
当前位置:首页 → 问答吧 → 【求助】为什么eval 正则会溢出?

【求助】为什么eval 正则会溢出?

时间:2011-07-11

来源:互联网

新手问题
  1. while (<IN>){
  2.                         chomp;
  3.                         my ($host,$date,$url_with_method,$status,$size,$referrer,$agent) = m/^(\S+) - - \[(\S+ [\-|\+]\d{4})\] "(\S+ \S+ [^"]+)" (\d{3}) (\d+|-) "(.*?)" "([^"]+)"$/;
  4.                         my ($user,$uvid,$yid)=("","","");
  5.                         if (/user=(.*?)&&/){
  6.                                 $user=$1;
  7.                         }
  8.                         if(/uvid=(.*?)&&/){
  9.                                 $uvid=$1;
  10.                         }
  11.                         if(/yid=(.*?)&&/){
  12.                                 $yid=$1;
  13.                         }
  14.                         $op="";
  15.                         $opn="";
  16.                         @opt=();
  17.                         @optn=();
  18.             foreach my $k (keys %$hc) {
  19.                                 if (exists $ha->{$k}){
  20.                                         if (eval($ha->{$k})){
  21.                                                 if ($vb==1){print "$k $ha->{$k} matched \n";}
  22.                                                 push @opt,$k;
  23.                                                 push @optn,exists $ht->{$k}? $ht->{$k}:"";;
  24.                                                 if (ref($hc->{$k}) eq 'ARRAY'){
  25.                                                         my @ar = @{$hc->{$k}};
  26.                                                         foreach my $m (@ar){
  27.                                                                 if($vb==1){print "m ---->".$m."\n";}
  28.                                                                 if (exists $ha->{$m}){
  29.                                                                         if(eval($ha->{$m})){
  30.                                                                                 push @opt,$m;
  31.                                                                                 push @optn,exists $ht->{$m}? $ht->{$m}:"";
  32.                                                                                 next;
  33.                                                                         }
  34.                                                                 }
  35.                                                         }
  36.                                                 }
  37.                                                 last;
  38.                                         }
  39.                                 }
  40.                         }
  41. ...
  42. }
复制代码
请问foreach这段为什么总是溢出呢? 其中%ha 存放的类似于 a => /a/&&/b/ b=> /b/的正则 %hc 存放的类似于 a => b c d 的分类,先对大类检索,然后再逐一检索小类。

作者: windrlee   发布时间: 2011-07-11

希望给出能重现问题的代码和数据,还有说清晰错误的内容

作者: zhlong8   发布时间: 2011-07-11