7

我正在使用带有两个单独的正则表达式的 while 循环

while(($string1=~m/(\d+)/igs)==($string2=~m/([^^]*?)\n+/igs)) {}

存储我使用过的 $string1 的匹配模式的值$temp1=$1

如何存储$string2. 请给点建议。

4

3 回答 3

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";
}
于 2013-09-02T19:09:03.960 回答
3

可能有更聪明的方法,但我只是将它们分解为单独的语句:

while (1) {
    $res1 = $string1=~m/(\d+)/igs;
    $temp1 = $1;
    $res2 = $string2=~m/([^^]*?)\n+/igs
    $temp2 = $1;
    last unless $res1 == $res2;
    ...
}

仅仅因为它是 perl,您不必找到最简洁、最神秘的方式来编写某些东西(这就是 APL 的用途)。

于 2013-09-02T18:19:58.667 回答
0

如果“g”和“s”选项对您的任务来说不是真正必要的,并且您实际上只想比较第一个匹配的子字符串,您可以进行如下的单行测试:

if (($a =~ /regex1/)[0] == ($b =~ regex2/)[0]) {
    ...

如果您需要知道两个匹配的字符串是什么,只需添加一些临时变量来保存它们:

if (($first = ($a =~ /regex1/)[0]) == ($second = ($b =~ regex2/)[0])) {
    ...

但是,如果您真的想比较每个字符串中的所有连续匹配项以查看每对是否相等,那么我想不出单语句解决方案可以做到这一点。您的正则表达式每个都返回一个列表,“==”只比较它们的长度。您必须使用上面提出的第一个解决方案,并以“手写”形式写出比较代码。

上面的第二个解决方案不起作用,因为它只会继续测试每个字符串中的第一个匹配项。

有点难以理解你想要做什么,但你至少可以在 /(\d+)/ 的第一个测试中去掉“i”选项。大概只有第二个字符串需要“s”选项,因为您正在寻找嵌入式换行符。

于 2013-09-02T20:21:32.993 回答