在for循环中使用.subst替换字符串

瓦尔卢卡斯

我想for使用命名捕获在一个块中进行字符串替换我期望得到数字1,2,3作为输出。但这是Nil第一次运行,然后是2和3运行的1和2。如何.subst在循环结构中正确使用使用map构造代替for循环时,我看到相同的行为如果我将其替换为固定的字符串值,它将按预期工作。

for <a1 b2 c3> -> $var {
    say $var;
    say $var.subst(/.$<nr>=(\d)/, $<nr>); #.subst(/.$<nr>=(\d)/, 'X'); #OK      
}

#`[
This is Rakudo version 2019.11 built on MoarVM version 2019.11   
Output:

a1
Use of Nil in string context
  in block  at test3.pl6 line 3

b2
1
c3
2
]
雷夫

TL; DR将评估推迟$<nr>到对正则表达式进行评估之后。@ JoKing ++提出了一种方法另一个方法是用大括号({$<nr>}包裹替换项

当您的原始代码调用时会发生什么 subst

在Raku尝试调用该subst例程之前,它会汇总一组要传递给它的参数。

有两个值。第一个是正则表达式。它并没有运行第二个值是$<nr>求值的Nil原因是,在程序开始时,当前的match对象变量绑定到声称其值为true的对象,Nil并且任何尝试访问其中的键的值的尝试$<nr>-也会返回Nil因此,在此之前,一切都已经出错了subst

一旦Raku汇编了此参数列表,它将尝试调用subst它成功并subst运行。

要获得下一个匹配项,请subst运行正则表达式。这将更新当前的match对象变量$/但是,现在已经太晚了,无法与已经传递给的替换值产生任何区别subst

有了match,subst接下来看一下替换参数。它找到Nil并采取相应措施。

对于的第二次调用subst$<nr>已采用的第一次调用的值subst等等。

推迟评估的两种方法 $<nr>

@JoKing建议考虑使用S///此构造首先评估正则表达式(在第一对/s之间),然后评估替换(在最后一对/s之间)。(如果使用其他有效的S语法,例如,则适用相同的原理S[...] = ...。)

如果使用subst,则如上一节中所述,Raku在调用它之前将其参数列表放在一起。它找到一个正则表达式(它不运行)和一个闭包(它也不运行)。然后,它尝试subst使用这些参数进行调用,并成功执行了该操作。

接下来,subst开始运行。它已经收到了匹配(正则表达式)和替换(闭包)的代码。

它运行正则表达式作为匹配操作。如果正则表达式返回匹配项,则subst运行闭包并将其返回的值用作替换。

因此,由于我们从传递$<nr>为裸值(Nil即将其冻结为)切换为将其包装在一个封闭的容器中,从而将其评估推迟到将其$/设置为与填充的<nr>条目匹配之前,我们解决了该问题。

请注意,这只是工作,因为谁设计/实施subst为智能/不错的,足以让比赛双方替代参数是形式Code(对于比赛和普通封闭的替代正则表达式),如果用户希望这样。然后,它首先运行匹配项,然后,如果已通过替换关闭,则运行替换关闭,并使用后一个调用结果作为最终替换。同样,S///之所以起作用是因为被设计为仅在首次评估替换后评估替换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在for循环中使用python替换功能

来自分类Dev

循环替换字符串

来自分类Dev

循环替换字符串

来自分类Dev

如何使用变量变量 PHP 在 for 循环中使用 SELECT 创建字符串

来自分类Dev

在批处理文件FOR循环中的子字符串操作中使用变量

来自分类Dev

如何在C循环中使用不同的临时字符串?

来自分类Dev

在forEach()循环中使用字符串变量来按角度获取数据

来自分类Dev

在for循环中使用auto vs decltype(vec.size())处理字符串向量

来自分类Dev

如何提取命令结果字符串并在循环中使用它

来自分类Dev

在SQL FOR-IN(SELECT)循环中使用字符串变量的值

来自分类Dev

在while循环中使用php字符串作为javascript函数中的参数

来自分类Dev

如何在循环中使用多个条件来比较字符串的不同索引?

来自分类Dev

在构建aws命令的for循环中使用文件名的子字符串作为参数

来自分类Dev

如何在 for 循环中使用 re.compile 来提取子字符串索引

来自分类Dev

在 foreach 循环中使用变量构建 XSLT 字符串

来自分类Dev

如何在for循环中使用字符串数组

来自分类Dev

在Java中使用替换字符串

来自分类Dev

在R的for循环中使用字符串-在for循环中将字符串作为ANOVA中的变量包含时出错

来自分类Dev

字符串替换在for循环中不起作用-Java

来自分类Dev

在for循环中用regexprep替换字符串?(MATLAB)

来自分类Dev

GNU make中for循环中的字符串替换

来自分类Dev

用for循环中的字符串替换int或long?

来自分类Dev

在for循环中用regexprep替换字符串?(MATLAB)

来自分类Dev

在 Excel 中使用宏在循环中查找和替换

来自分类Dev

在 bash for 循环中使用命令替换

来自分类Dev

如何在python中使用字符串作为数组的名称,以便可以在for循环中使用

来自分类Dev

在Windows批处理中的循环中使用变量替换另一个变量中的子字符串

来自分类Dev

Django模板在for循环中使用空格和空字符

来自分类Dev

在循环中使用 scanf 动态读取 C 中的字符

Related 相关文章

  1. 1

    在for循环中使用python替换功能

  2. 2

    循环替换字符串

  3. 3

    循环替换字符串

  4. 4

    如何使用变量变量 PHP 在 for 循环中使用 SELECT 创建字符串

  5. 5

    在批处理文件FOR循环中的子字符串操作中使用变量

  6. 6

    如何在C循环中使用不同的临时字符串?

  7. 7

    在forEach()循环中使用字符串变量来按角度获取数据

  8. 8

    在for循环中使用auto vs decltype(vec.size())处理字符串向量

  9. 9

    如何提取命令结果字符串并在循环中使用它

  10. 10

    在SQL FOR-IN(SELECT)循环中使用字符串变量的值

  11. 11

    在while循环中使用php字符串作为javascript函数中的参数

  12. 12

    如何在循环中使用多个条件来比较字符串的不同索引?

  13. 13

    在构建aws命令的for循环中使用文件名的子字符串作为参数

  14. 14

    如何在 for 循环中使用 re.compile 来提取子字符串索引

  15. 15

    在 foreach 循环中使用变量构建 XSLT 字符串

  16. 16

    如何在for循环中使用字符串数组

  17. 17

    在Java中使用替换字符串

  18. 18

    在R的for循环中使用字符串-在for循环中将字符串作为ANOVA中的变量包含时出错

  19. 19

    字符串替换在for循环中不起作用-Java

  20. 20

    在for循环中用regexprep替换字符串?(MATLAB)

  21. 21

    GNU make中for循环中的字符串替换

  22. 22

    用for循环中的字符串替换int或long?

  23. 23

    在for循环中用regexprep替换字符串?(MATLAB)

  24. 24

    在 Excel 中使用宏在循环中查找和替换

  25. 25

    在 bash for 循环中使用命令替换

  26. 26

    如何在python中使用字符串作为数组的名称,以便可以在for循环中使用

  27. 27

    在Windows批处理中的循环中使用变量替换另一个变量中的子字符串

  28. 28

    Django模板在for循环中使用空格和空字符

  29. 29

    在循环中使用 scanf 动态读取 C 中的字符

热门标签

归档