0

我是 Perl 的新手,但我想知道如果我创建一个带有捕获的正则表达式变量,甚至是代码断言等其他类型的副作用,然后使用插值将此正则表达式插入到更大的正则表达式组合中,然后再次重复这个过程?

就副作用行为而言,控制最终组合的真正作用是否会变得一团糟,甚至可能?有这方面的文件吗?

4

2 回答 2

0

有很多关于这方面的文档,并且它随 Perl 一起提供。:)

首先,插值发生在 Perl 处理模式的字符之前。了解双引号上下文中的操作顺序。内插字符串中的任何特殊字符仍然是特殊的。

要回答您的问题,您只需尝试一下即可。

use v5.10;

my $start = qr/(Buster|Mimi)/;  
say "Starting regex --> $start";

my $middle = qr/My (cat is $start)/i;   
say "Middle regex --> $middle";

my $end = qr/Find \s+ "$middle"/x;  
say "End regex --> $end";

这表明每个正则表达式都嵌入到较大的正则表达式中,保留了它的选项。

Starting regex --> (?^:(Buster|Mimi))
Middle regex --> (?^i:My (cat is (?^:(Buster|Mimi))))
End regex --> (?^x:Find \s+ "(?^i:My (cat is (?^:(Buster|Mimi))))")

每个级别的捕获规则都是相同的。它们由开始捕获括号的顺序决定。Perl 不会让您跟踪任何类型的嵌套或“谁先到那里”。如果您不想跟踪编号的捕获变量,可以使用命名捕获。

于 2012-08-09T19:09:21.480 回答
-1

你的意思是这样吗?

my $name = "bob";
while ($name_from_file = <STDIN>) {
   chomp $name_from_file;
   if ($name_from_file =~ /^$name\n/i)
   print "I got something for $name!\n";
}

是的,你可以。

但是,更好的方法是使用qr来帮助构建正则表达式:

my $re_name = qr(^) . qr(bob) . qr(\s);
while ($name_from_file = <STDIN>) {
   chomp $name_from_file;
   if ($name_from_file =~ /$re_name/i)
   print "I got something for $name!\n";
}

这样,您的正则表达式可以更轻松地插入变量。

于 2012-08-09T17:57:55.300 回答