Perl替代模式匹配中的算术计算

mik*_*max 4 regex perl

仅使用一个 Perl替代正则表达式语句(s///),我们如何编写以下代码:

每个成功的比赛都只包含一串字母字符A..Z。我们需要用匹配项替换匹配字符串,该替换项将是匹配字符串中每个字符的字符索引(按字母顺序)的总和。

注意:对于A,字符索引将为1,对于B,字符索引将为2 ...,对于Z将为26。

请参见下面的示例:

success match: ABCDMNA  
substitution result: 38  
Run Code Online (Sandbox Code Playgroud)

注意:

1 + 2 + 3 + 4 + 13 + 14 + 1 = 38; 
Run Code Online (Sandbox Code Playgroud)

以来

A = 1, B = 2, C = 3, D = 4, M = 13, N = 14 and A = 1.
Run Code Online (Sandbox Code Playgroud)

TLP*_*TLP 5

我想我会将其发布为答案,尽管提出这个想法的功劳应该归功于abiessu回答中提出的想法。

perl -ple'1 while s/(\d*)([A-Z])/$1+ord($2)-64/e' 
Run Code Online (Sandbox Code Playgroud)

由于这显然是家庭作业和/或学术兴趣,因此我将在扰流板标签中发布说明。

-我们匹配一个可选数字(\d*),后跟一个字母([A-Z])。数字是运行总和,字母是我们需要加到总和上的数字。
-通过使用/e修饰符,我们可以进行数学运算,即将捕获的数字添加到ord()捕获的字母的值减去64。将返回并插入总和,而不是数字和字母。
-我们使用while循环冲洗并重复直到所有字母都被替换,剩下的只是一个数字。我们使用while循环而不是/g修饰符将匹配项重置为字符串的开头。