我正在使用带有两个单独正则表达式的while循环
while(($string1=~m/(\d+)/igs)==($string2=~m/([^^]*?)\n+/igs)) {}
存储我使用$temp1=$1
,
如何存储$string2
的匹配模式。请给出一些建议。
答案 0 :(得分:5)
my ($m1,$m2);
while (do{
($m1,$m2) = ();
$m1 = $1 if $string1 =~ /(\d+)/igs;
$m2 = $1 if $string2 =~ /([^^]*?)\n+/igs;
defined $m1 == defined $m2;
}) {
# print "$m1-$m2-\n";
}
答案 1 :(得分:3)
可能有更聪明的方法,但我只是把它们分成单独的陈述:
while (1) {
$res1 = $string1=~m/(\d+)/igs;
$temp1 = $1;
$res2 = $string2=~m/([^^]*?)\n+/igs
$temp2 = $1;
last unless $res1 == $res2;
...
}
仅仅因为它是perl你没有拥有来找到最简洁,最神秘的写东西的方式(这就是APL的用途)。
答案 2 :(得分:0)
如果你的任务并不真正需要“g”和“s”选项而你实际上只想比较第一个匹配的子串,你可以按如下方式进行单行测试:
if (($a =~ /regex1/)[0] == ($b =~ regex2/)[0]) {
...
如果您需要知道两个匹配的字符串是什么,只需添加一些临时变量来保存它们:
if (($first = ($a =~ /regex1/)[0]) == ($second = ($b =~ regex2/)[0])) {
...
但是如果你真的想要比较每个字符串中的所有连续匹配以查看每对是否相等,那么我认为没有单一语句解决方案可以做到这一点。你的正则表达式都返回一个列表,“==”只比较它们的长度。你必须使用上面提出的第一个解决方案并在“long-hand”中写出比较代码。
上面的第二个解决方案不起作用,因为它将继续测试每个字符串中的第一个匹配。
有点难以理解你想要做什么,但你至少可以在/(\ d +)/的第一次测试中删除“i”选项。据推测,只有第二个字符串需要“s”选项,因为您正在寻找嵌入式新行。