Perl简单正则表达式捕获组不捕获

问题描述:

为了输入数据,我有一个可变大小的散列,其中多个元素具有相似的名称。哈希可能看起来像是一个例子;Perl简单正则表达式捕获组不捕获

  • wineName0 =>夏敦埃
  • wineFull0 => 4.00
  • wineHalf0 => 2.00
  • wineName1 =>黑比诺
  • wineFull1 => 16.00
  • wineHalf1 => 8.00
  • plateName0 =>侧腹牛排
  • plateCost0 => 14.00
  • plateTemps0 =>允许

至于处理它们,我通过键迭代,具有正则表达式检查它们,捕获它们的数量,然后使用该编号,以抓住类似编号的元件,像这样;

 foreach $key (sort keys %in){ 
      if($key =~ /wineName(\d+)/){ 
       if($wineTable eq ""){ 
        $wineTable = qq{ 
     <tr> 
      <td colspan=3 class="label">Wines</td> 
     </tr> 
        }; 
       } 
       $wineName = $key; 
        $in{$wineName} =~ s/\s/+/g; 
       $wineFull = "wineFull$1"; 
       $wineHalf = "wineHalf$1"; 

       $wineTable .= qq{ 
     <tr> 
      <!-- $key --> 
      <td>$in{$wineName}</td> 
      <td>\$$in{$wineFull}</td> 
      <td>\$$in{$wineHalf}</td> 
     </tr> 
       }; 
      } 
      if($key =~ /beerName(\d+)/){ 
       if($beerTable eq ""){ 
        $beerTable = qq{ 
     <tr> 
      <td colspan=3 class="label">Beers</td> 
     </tr> 
        }; 
       } 
       $beerName = $key; 
        $in{$beerName} =~ s/\s/+/g; 
       $beerFull = "beerFull$1"; 
       $beerHalf = "beerHalf$1"; 

       $beerTable .= qq{ 
     <tr> 
      <!-- $key --> 
      <td>$in{$beerName}</td> 
      <td>\$$in{$beerFull}</td> 
      <td>\$$in{$beerHalf}</td> 
     </tr> 
       }; 
      } 
      if($key =~ /plateName(\d+)/){ 
       if($plateTable eq ""){ 
        $plateTable = qq{ 
     <tr> 
      <th>Name</th> 
      <th>Cost</th> 
      <th>Cook Temperatures</th> 
     </tr> 
        }; 
       } 
       my $plateName = $key; 
        $in{$plateName} =~ s/\s/+/g; 
       my $plateCost = "plateCost$1"; 
       my $plateTemp = "plateTemps$1"; 

       if($in{$plateTemp}){ 
        $in{$plateTemp} = 1; 
       }else{ 
        $in{$plateTemp} = 0; 
       } 

       $plateTable .= qq{ 
     <tr> 
      <!-- $key --> 
      <td>$in{$plateName}</td> 
      <td>\$$in{$plateCost}</td> 
      <td>$in{$plateTemp}</td> 
     </tr> 
       }; 
      } 
     } 

我的问题是,由于某些原因,/plateName(\d+)/不捕获。所以如果$key == "plateName1",$plateCost结束等于“plateCost”,而不是“plateCost1”。我给出的散列键作为示例是实际的例子。考虑到这一点,我需要帮助理解为什么葡萄酒的正则表达式起作用,而正则表达式不适用,因为它们几乎完全相同。

+0

你可以分享你的具体正则表达式和数据的情况下,它不工作? –

+0

@FedericoPiazza显示的正则表达式和数据正是我正在使用的。 –

+0

你期望输出什么?它似乎适用于我,它不会在循环的同一迭代中填充葡萄酒和盘子,因为它在每个步骤中只处理一个键。 – choroba

根据您发布的代码,它看起来像问题是:

$in{$plateName} =~ s/\s/+/g; 

,你必须在模式太多/