私が指定した特定の基準を満たすすべての単語に対して/usr/dict/wordsを検索するスクリプトを作成したいと思います。たとえば、すべての回文の単語(「racecar」、「madam」など)を検索したり、最初と2番目の半分が反転して単語を形成するすべての単語(「german」や「manger」など)を見つけます。 。スクリプトのスケルトンは、辞書の各単語を読み取る簡単なループになり、探している項目に応じて式や類似の項目を置き換えることによって基準を変更できます。
どういうわけか正規表現を含める必要があると思います(または各単語の個々の文字を表示する方法を見つける必要があります)。また、現在の単語の文字を辞書の他の単語と比較する方法も必要です(上記の2番目の例のように)。
これに最適なツールは何ですか?
ベストアンサー1
次のperl
スクリプトは、標準入力および/またはコマンドラインにリストされているファイル名から単語リストを読み取り、見つかったすべての回文と元に戻すことができる単語を印刷します。 3文字未満の単語は無視します(主に私の/usr/share/dict/words
ファイルには「A」や「Aa」などのゴミが多いためです)。
これは非常に単純なPerlで書かれており、「賢い」Perlトリックを使用せずにできるだけ簡単に理解して修正できるように設計されています。
#! /usr/bin/perl
use strict;
my %dict = ();
print "Palindromes\n";
print "-----------\n";
while(<>) {
chomp;
next if (length($_) < 3);
$dict{$_} = 1;
print "$_\n" if ($_ eq reverse($_));
}
print "\n\nReversibles\n";
print "-----------\n";
foreach my $key (keys %dict) {
my $len = length($key);
my $firsthalf = '';
my $secondhalf = '';
if (($len / 2) == int($len/2)) {
# even length words
$firsthalf = substr($key,0,int($len/2));
$secondhalf = substr($key,int($len/2));
} else {
# odd length words
$firsthalf = substr($key,0,int($len/2)+1);
$secondhalf = substr($key,int($len/2)+1);
};
my $rev = $secondhalf . $firsthalf;
next unless (exists $dict{$rev});
# don't print if reversed word is a palindrome
next if ($rev eq $key);
print "$key => $rev\n";
}
次の出力を生成します。
$ ./find-P-and-R.pl /usr/share/dict/words
Palindromes
-----------
MGM
aba
abba
aga
aha
aia
aka
...
...
...
Reversibles
-----------
mode => demo
reenter => terreen
juba => baju
oon => noo
lave => vela
lassi => silas
updo => doup
air => rai
...
...
...