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”。我给出的散列键作为示例是实际的例子。考虑到这一点,我需要帮助理解为什么葡萄酒的正则表达式起作用,而正则表达式不适用,因为它们几乎完全相同。
答
根据您发布的代码,它看起来像问题是:
$in{$plateName} =~ s/\s/+/g;
,你必须在模式太多/
?
你可以分享你的具体正则表达式和数据的情况下,它不工作? –
@FedericoPiazza显示的正则表达式和数据正是我正在使用的。 –
你期望输出什么?它似乎适用于我,它不会在循环的同一迭代中填充葡萄酒和盘子,因为它在每个步骤中只处理一个键。 – choroba