有没有办法在没有无限循环的情况下做到这一点?
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)
在Perl的正则表达式教程说:
在标量上下文中,对字符串的连续调用将具有// g从匹配跳转到匹配,跟踪字符串中的位置.
但:
在列表上下文中,// g返回匹配分组的列表,或者如果没有分组,则返回整个正则表达式的匹配列表.
也就是说,在列表上下文中一次//g返回所有捕获的匹配的数组(其中您随后丢弃除第一个之外的所有匹配),然后在每次循环执行时(即永远)再次执行此操作.
因此,您无法在循环条件中使用列表上下文分配,因为它不能执行您想要的操作.
如果您坚持使用列表上下文,则可以这样做:
foreach my $var ($string =~ /regexline(.+?)end/g) {
print $var;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有无限循环的情况下做到这一点?
是.使用foreach()而不是while()循环:
foreach my $var ($string =~ /regexline(.+?)end/g) {
Run Code Online (Sandbox Code Playgroud)
如果我想搜索它,这个符号/技巧实际上是什么叫做
它在列表上下文中称为匹配.它在"perldoc perlop"中描述:
g修饰符指定全局模式匹配 - 即在字符串中尽可能多地匹配.它的行为取决于上下文.在列表上下文中......