带有斜杠的perl regex变量

时间:2011-06-22 20:45:37

标签: regex perl

我需要一个perl正则表达式来检查$ currentLine中是否存在$ currentSearch。 检查应包括$ currentLine中有“Load”关键字。

匹配

$currentSearch = DNA/3/44.com/index.html

$currentLine = Load DNA/3/44.com/index.html .....(3)

我尝试了这个,但它不匹配......

if($currentLine[$k] =~ m/Load\s+$currentSearch[$i]\s+\.+\\(d+\)/)

修改 即使这不起作用

 if($currentLine[$k] =~ m/$currentSearch[$i]/)

3 个答案:

答案 0 :(得分:3)

您有错误 - 您需要转义d字符以捕获数字而不是'd'char。你也有一个太多的反斜杠(你错过了第一个paren)。

这是一个有效的脚本:

$currentSearch = "DNA/3/44.com/index.html";


$currentLine = "Load DNA/3/44.com/index.html .....(3)";


if($currentLine =~ /Load\s+$currentSearch\s+\.+\(\d+\)/) {
    print "matched\n";
} else {
    print "no match\n";
}

答案 1 :(得分:3)

我怀疑你的问题来自不使用:

use strict;
use warnings;
在你的脚本中

首先,前两个语句$currentSearch$currentLine中的字符串没有引号。这可能是一个错字,但看起来很奇怪。

其次,在if语句中,您将它们称为数组而不是标量。假设这不是另一个错字,那可能是您问题的根源。 $currentSearch$currentSearch[$i]指的是两个完全不同的变量。

没有警告和严格,即使使用两个未声明和未定义的变量也不会导致任何错误的迹象。

实际上这是:

perl -e 'if ($foo[0]=~ /$bar[1]/) { print "sure, why not?" }'

实际上是一个成功的匹配,并且会打印字符串,即使变量@foo@bar都是完全空的。使用strictwarnings时,它会像应该的那样崩溃和刻录。

无论如何,这有效:

my $cs = "DNA/3/44.com/index.html";
my $cl = "Load DNA/3/44.com/index.html .....(3)";

if ( $cl =~ /Load\s+$cs[\s\.]+\((\d+)\)/ ) {
    print "Yes: $1\n";
} else { print "Nope!" }

如果搜索字符串中有任何元字符,则可能导致很难检测到错误,在这种情况下,您可以尝试在搜索字符串中输入quotemeta

答案 2 :(得分:0)

if ($currentLine =~ /Load\s+\Q$currentSearch\E/) { ... }