如何将下一个搜索位置的开头倒数1?例如,假设我想匹配#
之间的所有数字。以下将只给出奇数数字。
my $data="#1#2#3#4#";
while ( $data =~ /#(\d)#/g ) {
print $1, "\n";
}
但如果我可以将下一个位置的开头倒数1,我会得到偶数和奇数。
这不起作用:pos() = pos() - 1;
我知道我可以使用split
来完成此任务。但这并没有回答我的问题。
for (split /#/, $data) {
print $_, "\n";
}
答案 0 :(得分:11)
一种方法是使用look-ahead assertion:
while ( $data =~ /#(\d)(?=#)/g ) {
print $1, "\n";
}
前瞻断言中的字符不是匹配表达式的一部分,也不会更新pos()
超过正则表达式的\d
部分。
更多演示:
say "#1#2#3#4#" =~ /#(\d)/g; # 1234
say "#1#2#3#4" =~ /#(\d)/g; # 1234
say "#1#2#3#4#" =~ /#(\d)(?=#)/g; # 1234
say "#1#2#3#4" =~ /#(\d)(?=#)/g; # 123
答案 1 :(得分:8)
您在pos()
上呼叫$_
,而不是$data
来自perldoc
返回最后一个m // g搜索为相关变量留下的偏移量(当未指定变量时使用$ _)
所以,
pos($data) = pos($data) - 1;