perl中的无限while循环

Jef*_*eff 10 regex perl

有没有办法在没有无限循环的情况下做到这一点?

while((my $var) = $string =~ /regexline(.+?)end/g) {
    print $var;
}
Run Code Online (Sandbox Code Playgroud)

这导致无限循环,可能是因为直接从while内的正则表达式中分配var每次都返回"true"?

我知道我可以这样做:

while($string =~ /regexline(.+?)end/g) {
     my $var = $1;      
     print $var;
}
Run Code Online (Sandbox Code Playgroud)

但我希望我能省下一条线.有没有我可以使用的正则表达式修饰符或类似的东西?

(另外,如果我想搜索它,这个符号/技巧实际上是什么?

(my $var) = $string =~ /regex/;
Run Code Online (Sandbox Code Playgroud)

谢谢!!

mob*_*mob 10

在标量上下文中,带有/g修饰符的正则表达式将充当迭代器,并在没有更多匹配时返回false值:

print "$1\n" while "abacadae" =~ /(a\w)/g;     # produces "ab","ac","ad","ae"
Run Code Online (Sandbox Code Playgroud)

通过while表达式中的赋值,您将在列表上下文中评估正则表达式.现在你的正则表达式不再像迭代器那样,它只返回匹配列表.如果列表不为空,则计算结果为真值:

print "$1\n" while () = "abacadae" =~ /(a\w)/g;   # infinite "ae"
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,你可以从while语句中取出赋值并使用builtin $1变量在循环中进行赋值?

while ($string =~ /regexline(.+?)end/g) {
    my $var = $1;
    print $var;
}
Run Code Online (Sandbox Code Playgroud)


mer*_*tor 8

Perl的正则表达式教程说:

在标量上下文中,对字符串的连续调用将具有// g从匹配跳转到匹配,跟踪字符串中的位置.

但:

在列表上下文中,// g返回匹配分组的列表,或者如果没有分组,则返回整个正则表达式的匹配列表.

也就是说,在列表上下文中一次//g返回所有捕获的匹配的数组(其中您随后丢弃除第一个之外的所有匹配),然后在每次循环执行时(即永远)再次执行此操作.

因此,您无法在循环条件中使用列表上下文分配,因为它不能执行您想要的操作.

如果您坚持使用列表上下文,则可以这样做:

foreach my $var ($string =~ /regexline(.+?)end/g) {
    print $var;
}
Run Code Online (Sandbox Code Playgroud)


tad*_*dmc 8

有没有办法在没有无限循环的情况下做到这一点?

是.使用foreach()而不是while()循环:

foreach my $var ($string =~ /regexline(.+?)end/g) {
Run Code Online (Sandbox Code Playgroud)

如果我想搜索它,这个符号/技巧实际上是什么叫做

它在列表上下文中称为匹配.它在"perldoc perlop"中描述:

g修饰符指定全局模式匹配 - 即在字符串中尽可能多地匹配.它的行为取决于上下文.在列表上下文中......

  • 请注意,`foreach`将整个结果集加载到内存中,而不是像`while`那样迭代它. (2认同)