我写了下面的代码来欺骗 Wordle(我不擅长)。有没有办法将以下部分组合成单个正则表达式语句:
($word =~ m/c/i) and
($word =~ m/a/i) and
($word =~ m/o/i)
Run Code Online (Sandbox Code Playgroud)
即找到以任意顺序包含所有三个字母“c”、“a”、“o”的单词。
#!/usr/bin/perl
use 5.30.3;
use warnings;
my $dic_file = "/usr/share/dict/web2";
open (IN,"<", $dic_file) or die "Cannot open file.\n $!";
while (my $word=<IN>){
chomp $word;
if (length($word) == 5){
if( ($word !~ m/[rtn]/i) and
($word =~ m/c/i) and
($word =~ m/a/i) and
($word =~ m/o/i)
){
say $word;
}
}
}
Run Code Online (Sandbox Code Playgroud)
$_通过使用代替 ,您可以获得巨大的收益$word。
my $dic_file = "/usr/share/dict/web2";
open( my $fh, "<", $dic_file )
or die( "Can't open `$dic_file`: $!\n" );
while ( <$fh> ) {
chomp;
say if length == 5 && !/[rtn]/i && /c/i && /a/i && /o/i;
}
Run Code Online (Sandbox Code Playgroud)
可以使用前瞻从正则表达式中得到“and”。
my $dic_file = "/usr/share/dict/web2";
open( my $fh, "<", $dic_file )
or die( "Can't open `$dic_file`: $!\n" );
while ( <$fh> ) {
chomp;
say if /^(?=.*c)(?=.*a)(?=.*o)[^rtn]{5}\z/si;
}
Run Code Online (Sandbox Code Playgroud)
您可以轻松地将其写成一行字。
perl -nle'print if /^(?=.*c)(?=.*a)(?=.*o)[^rtn]{5}\z/si' /usr/share/dict/web2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |