我是 Perl 的新手,但我想知道如果我创建一个带有捕获的正则表达式变量,甚至是代码断言等其他类型的副作用,然后使用插值将此正则表达式插入到更大的正则表达式组合中,然后再次重复这个过程?
就副作用行为而言,控制最终组合的真正作用是否会变得一团糟,甚至可能?有这方面的文件吗?
我是 Perl 的新手,但我想知道如果我创建一个带有捕获的正则表达式变量,甚至是代码断言等其他类型的副作用,然后使用插值将此正则表达式插入到更大的正则表达式组合中,然后再次重复这个过程?
就副作用行为而言,控制最终组合的真正作用是否会变得一团糟,甚至可能?有这方面的文件吗?
有很多关于这方面的文档,并且它随 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 不会让您跟踪任何类型的嵌套或“谁先到那里”。如果您不想跟踪编号的捕获变量,可以使用命名捕获。
你的意思是这样吗?
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";
}
这样,您的正则表达式可以更轻松地插入变量。