我最近创建了一个 Perl 脚本,使用以下代码搜索以 D 和 E 开头的单词:
$infile = 'words.txt';
open(IN, $infile);
$count = 0;
while ($word = <IN>) {
chomp($word);
if ($word =~ /^d\w*e$/i) {
print "$word\n";
$count++;
}
}
print "$count\n";
我最近决定分叉代码并创建一个脚本来搜索包含六个字母的单词,并且该单词中的字母按字母顺序(A 到 Z)排列。而不是使用单词.txt,我计划使用位于的 Unix 标准字典usr/share/dict/words 目录。如何通过修改此代码来实现此目的?
看起来您真正需要的是一种用于检查给定单词中的字母是否按字母顺序排列的算法。有多种方法,但该子例程的工作原理是将单词拆分为其组成字符的列表,对该列表进行排序并重新组合。如果结果与原始单词匹配,则该单词已经排序。
use strict;
use warnings;
use feature 'fc';
for (qw/ a ab ba cab alt effort toffee /) {
print "$_\n" if in_alpha_order($_);
}
sub in_alpha_order {
my $word = fc(shift);
my $new = join '', sort $word =~ /./g;
return $new eq $word;
}
output
a
ab
alt
effort
如果你真的想在正则表达式中执行此操作,你可以构建一个像
a(?=[a-z]) | b(?=[b-z]) | c(?=[c-z]) ...
这是一个以这种方式工作的程序。其输出与上面的输出相同。
use strict;
use warnings;
my $regex = join '|', map "${_}(?=[$_-z])", 'a'..'z';
$regex = qr/^(?:$regex)*.$/i;
for (qw/ a ab ba cab alt effort toffee /) {
print "$_\n" if $_ =~ $regex;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)