まず第一に、変数名に整数サフィックスを追加していることに気付いた場合、配列を使用する必要があったと思います。
したがって、最初に単語セットを配列参照の配列に入れます。これは、一致した単語がどこから来たのかを特定するのに役立ちます。
次に、Regex::PreSufを使用して各単語リストからパターンを作成します。これは、正しい方法を常に忘れてしまうためです。
正規表現パターンで \bを使用すると、驚くべき結果が生じる可能性があることに注意してください。そのため、代わりに、コンテンツを個々の\w
文字シーケンスに分割します。
4 番目に、「(WWW::Mechanize を使用して) Web ページからのコンテンツを含む変数もある」とあなたは言います。コメント内の単語を一致させますか? title
属性で?そうでない場合は、HTML ドキュメントを解析して、完全なプレーン テキストを抽出するか、一致を特定の要素または要素のセット内に制限する必要があります。
次に、grep
テキスト内の単語のリストから単語セットに含まれる単語を検索し、一致した単語セットにマップします。
#!/usr/bin/env perl
use strict; use warnings;
use Regex::PreSuf qw( presuf );
my @wordsets = (
[ qw( DOG CAT HAMSTER ) ],
[ qw( DONKEY FOX PIG HORSE ) ],
[ qw( RHINO LION ELEPHANT ) ],
);
my @patterns = map {
my $pat = presuf(@$_);
qr/\A($pat)\z/;
} @wordsets;
my $content = q{Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis ELEPHANT exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in HAMSTER
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in DONKEY qui officia deserunt mollit anim id
est laborum.};
my @contents = split /\W+/, $content;
use YAML;
print Dump [
map {
my $i = $_;
map +{$_ => $i },
grep { $_ =~ $patterns[$i] } @contents
} 0 .. $#patterns
];
ここでは、指定された単語セットに含まれるgrep { $_ =~ $patterns[$i] } @contents
単語を抽出します@contents
。次に、map +{$_ => $i }
それらの単語を元の単語セットにマップします。外側map
は、各ワードセット パターンをループするだけです。
出力:
---
- ハムスター: 0
- ロバ: 1
- ゾウ: 2
つまり、各 hashref のキーが見つかった単語で、値が一致した単語セットである hashref のリストを取得します。