在Perl中捕获变量regex中的组

时间:2010-07-19 17:00:44

标签: regex perl

我需要制作一堆匹配项,除了要读取的文件名和regexp本身外,它们都使用相同的代码。因此,我想将匹配转换为只接受文件名和regexp作为字符串的过程。但是,当我使用变量来尝试匹配时,特殊捕获变量已停止设置。

$line =~ /(\d+)\s(\d+)\s/;

该代码正确设置$ 1和$ 2,但以下内容未定义:

$regexp = "/(\d+)\s(\d+)\s/";
$line =~ /$regexp/;

我有什么想法可以解决这个问题吗?

谢谢, 贾里德

3 个答案:

答案 0 :(得分:7)

使用qr代替引号:

$regexp = qr/(\d+)\s(\d+)\s/;
$line =~ /$regexp/;

答案 1 :(得分:4)

使用perl regex类似引号的运算符qr

引用您的字符串
$regexp = qr/(\d+)\s(\d+)\s/;

此运算符引用(并可能编译)其STRING作为正则表达式。

有关详细信息,请参阅perldoc页面: http://perldoc.perl.org/functions/qr.html

答案 2 :(得分:1)

使用qr引用你的正则表达式字符串:

my $regex = qr/(\d+)\s(\d+)\s/;
my $file =q!/path/to/file!;
foo($file, $regex);

然后在sub:

sub foo {
my $file = shift;
my $regex = shift;

open my $fh, '<', $file or die "can't open '$file' for reading: $!";
while (my $line=<$fh>) {
    if ($line =~ $regex) {
        # do stuff
    }
}