如何缩短这个 Perl 表达式

Sup*_*ech 3 regex perl

我写了下面的代码来欺骗 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)

ike*_*ami 6

$_通过使用代替 ,您可以获得巨大的收益$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)