Perl简单的正则表达式捕获组没有捕获

时间:2017-10-13 19:24:34

标签: regex 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”。我作为示例给出的散列键是实际示例。考虑到这一点,我需要帮助理解为什么葡萄酒的正则表达式工作,而板的正则表达式不起作用,考虑到它们几乎相同。

1 个答案:

答案 0 :(得分:-1)

根据您发布的代码,问题出现在:

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

你在模式中有太多/