清除正则表达式匹配变量的最佳方法是什么?

vol*_*ron 5 regex perl backreference

清除/重置所有正则表达式匹配变量的最佳方法是什么?


更新:我认为我不需要这样做,但是例子2只是一个例子.这个问题是关于重置匹配变量,而不是实现它们的最佳方法.

无论如何,最初我的编码风格更明确并且使用if-blocks.现在回到这个(例2)之后,阅读许多行代码会更加简洁,我会发现这种语法更容易理解.

Mar*_*eed 18

您应该使用匹配的返回值,而不是组变量的状态.

foreach (...) {
    doSomething($1) if /($some_value)/;
}
Run Code Online (Sandbox Code Playgroud)

如果比赛成功,$ 1等仅保证反映最近的比赛.除了比赛成功后,你不应该看着他们.

  • 更重要的一点是,您不应该做任何依赖于重置反向引用的事情.这是一个如何避免依赖您发布的代码的示例; 如果您有不同的示例,请发布,以便我们可以演示如何避免它.在成功匹配之后立即依赖于$ 1的内容是一个错误.期. (12认同)
  • `perlre`明确指出"Perl中的失败匹配不会重置匹配变量,这使得编写测试一系列更具体案例的代码更容易,并记住最佳匹配." (5认同)
  • @ vol7ron否.这完全是现场和记录的行为.[perlvar](http://perldoc.perl.org/perlvar.html#Variables-related-to-regular-expressions) (3认同)
  • @ vol7ron:够公平的.在你的情况下,我仍然会寻找其他相对低影响的重构机会,但不会涉及这种黑客行为,但如果你决定走这条路线......我不认为存在范围差异,其中你可以将$ 1声明为本地?如果做不到这一点,我认为你自己的解决方案是唯一的选择. (2认同)
  • ...或者你可能根本不能使用$ 1等,而是将匹配的结果分配给词汇变量.如果你做'我的@a = /.../`,那么如果匹配失败,$ a [1]将是undef. (2认同)

ike*_*ami 14

正则表达式捕获*由成功匹配重置.要重置正则表达式捕获,可以使用保证匹配的普通匹配操作.

"a" =~ /a/;  # Reset captures to undef.
Run Code Online (Sandbox Code Playgroud)

是的,它看起来很奇怪,但你要求做一些奇怪的事情.

如果您修复了代码,则不需要看起来很奇怪的解决方法.修复你的代码甚至揭示了一个错误!

修正:

$_ = "this is the man that made the new year rumble"; 
if (/ (is) / || / (isnt) /) {
   say $1; 
} else{ 
   ...  # You're currently printing something random.
}
Run Code Online (Sandbox Code Playgroud)

for (...) {
   if (/($some_pattern)/) {
      do_something($1);
   }
}
Run Code Online (Sandbox Code Playgroud)

* - Backrefs是与之前捕获的文本匹配的正则表达式模式.例如\1,\k<foo>.你实际上在谈论"正则表达式捕获缓冲区".


cjm*_*cjm 5

您应该测试匹配是否成功.例如:

foreach (...){
   /($some_value)/ or next;
   doSomething($1) if $1;
}

foreach (...){
   doSomething($1) if /($some_value)/ and $1;
}

foreach (...){
   if (/($some_value)/) {
      doSomething($1) if $1;
   }
}
Run Code Online (Sandbox Code Playgroud)

根据$some_value您要处理的匹配空字符串和/或0的内容和方式,您可能需要也可能不需要进行测试$1.

  • @ vol7ron你错过了这一点.当全局变量无效时,停止读取全局变量的值. (3认同)
  • @ vol7ron,当代码变得更复杂时,你可以尽一切可能避免远距离操作,例如使用过去某个时间可能已设置或未设置的"$ 1". (3认同)
  • 您可以重新构建代码,使其仅以不破坏代码的方式使其更具可读性.如果您没有成功匹配,则依赖于$ 1的值会破坏代码.你应该把它作为一个标志,无论你想做什么,你都需要以不同的方式去做. (2认同)