下面的代码打印出您想要匹配的所有 sub_phrases。
$phrase = 'I am searching for a text';
$\ = "\n";
@words = ();
print "Indices:";
while( $phrase =~ /\b\w+\b/g ) {
push @words, {word => $&, begin => $-[0], end => $+[0]};
}
$num_words = $#words + 1;
print 'there are ', $num_words, ' words';
for( $i=0; $i<$num_words; $i++ ) {
for( $j=$i; $j<$num_words; $j++ ) {
($start,$finish) = ($words[$i]->{begin}, $words[$j]->{end});
$sub_phrase = substr $phrase, $start, $finish-$start;
print "$i-$j: $sub_phrase";
}
}
一些解释:
- $\ 只是为了让“打印”更容易
- $phrase - 使用您的示例
- @words 是对记录的引用数组
- 每条记录都是单词本身的哈希,索引到单词的开头和结尾
- 我有一个正则表达式,我正在迭代。我正在寻找单词边界、1 个或多个单词字符和单词边界。
- $+ 和 $- 是最后一个 RE 匹配索引的特殊变量
- $& 是最后一个 RE 匹配的特殊变量
- 然后我有一个嵌套循环:$i,外部循环变量是第一个单词。$j 是最后一句话。这涵盖了所有的组合。
- 我正在计算 $sub_phrase 从第一个单词的开头到最后一个单词的结尾。
为了完成您的练习,您希望将所有 sub_phrase 保存到一个数组中(而不是 'print' 执行 'push' 到 @permutations)。然后遍历您的文本文件,并为每一行尝试匹配每个排列。