【问题标题】:Assign all capturing groups of one regex to a hash将一个正则表达式的所有捕获组分配给一个哈希
【发布时间】:2016-06-09 09:12:47
【问题描述】:

假设您有一个字符串,您知道该字符串至少会匹配一个正则表达式。该正则表达式有两个捕获组,您希望将每对分配给散列中的键值对。

我在想这样的事情,但我不确定这是否是 Perl 方式 - 或者它是否会起作用。

$string = 'f=banana&c=3;f=strawberry&c=1;f=coconut&c=6';
my %countedfruit;
($countedfruit{$1} = $2) = $string =~ /f=([a-z]+)&c=([0-9]+)/g;

for my $fruit (keys %countedfruit) {
    print "The count of '$fruit' is $countedfruit{$fruit}\n";
}

预期结果:

The count of 'banana' is 3
The count of strawberry is 1
The count of coconut is 6

实际结果:

The count of 'coconut' is 

【问题讨论】:

  • 回复:“我不确定这 [...] 是否可行”:但您肯定在发帖前尝试过吗?
  • @Bram 哇,你在玩真正的 Perl。我想知道问题限制是否对高代表用户有效......

标签: regex perl hash


【解决方案1】:

只需将哈希与对(匹配)列表一起提供

%countedfruit = $string =~ /f=([a-z]+)&c=([0-9]+)/g;

如果没有偶数列表(启用警告),这将发出警告,否则哈希中的键值对由m/返回的列表中的连续匹配对组成。

【讨论】:

  • Re:“如果配对不成功,就会有一个讨厌的错误”:你能详细说明一下吗?我看不出/f=([a-z]+)&c=([0-9]+)/g 如何 成对生成结果。 (也许给出一个触发错误的输入示例,以及结果输出?)
  • @ruakh 在纠正错误语句的过程中,我放弃了关于“讨厌的错误”的声明。我确实知道什么让我发痒,但无法想出代码来表达这一点。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多