以下のコードは、一致させたいすべての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」の代わりに「do」を@permutationsにプッシュします)。次に、テキストファイルを反復処理し、各行について、各順列との照合を試みます。