的re
编译可以产生你的信息似乎是有意
use strict;
use warnings;
use re qw(Debug DUMP);
my $re = qr/square[\s-]*dance/;
'Let\'s go to the square dance!' =~ $re;
输出:
Compiling REx "square[\s-]*dance"
Final program:
1: EXACT <square> (4)
4: STAR (17)
5: ANYOF[\11\12\14\15 \-][+utf8::IsSpacePerl] (0)
17: EXACT <dance> (20)
20: END (0)
anchored "square" at 0 floating "dance" at 6..2147483647 (checking anchored) minlen 11
Freeing REx: "square[\s-]*dance"
遗憾的是,似乎没有成为一个纲领性钩来获取这些信息。你必须拦截STDERR上的输出并解析它。粗糙验证的概念:
sub build_regexp {
my $string = shift;
my $dump;
# save off STDERR and redirect to scalar
open my $stderr, '>&', STDERR or die "Can't dup STDERR";
close STDERR;
open STDERR, '>', \$dump or die;
# Compile regexp, capturing DUMP output in $dump
my $re = do {
use re qw(Debug DUMP);
qr/$string/;
};
# Restore STDERR
close STDERR;
open STDERR, '>&', $stderr or die "Can't restore STDERR";
# Parse DUMP output
my @atoms = grep { /EXACT/ } split("\n", $dump);
return $re, @atoms;
}
使用这种方式:
my ($re, @atoms) = build_regexp('square[\s-]*dance');
$re
包含模式,@atoms
包含模式的文字部分的清单。在这种情况下,这是
1: EXACT <square> (4)
17: EXACT <dance> (20)
搜索模式可以任意复杂?如果您花时间构建索引,为何不解码存储格式并搜索您关心的位? – 2010-05-10 19:51:19