Perl Constant似乎不起作用

Dav*_* W. 4 perl constants

我有这个:

use constant JAR_FILE => qr/\.jar$/;

my @dir_list = ...;
my @jar_list;
find ( sub {
    return unless -f;
    return unless JAR_FILE;   #THIS IS THE TROUBLED LINE
    push @jar_list, $File::Find::name;
    }, @dir_list;

say join ": ", @jar_list;
Run Code Online (Sandbox Code Playgroud)

这将打印出@dir_list- jar文件和非jar文件中的所有文件;

但是,这个:

use constant JAR_FILE => qr/\.jar$/;

my @dir_list = ...;
my @jar_list;
find ( sub {
    return unless -f;
    return unless $_ =~ JAR_FILE;  #Now explicitly do the comparison 
    push @jar_list, $File::Find::name;
    }, @dir_list;

say join ": ", @jar_list;
Run Code Online (Sandbox Code Playgroud)

只打印jar文件.

这也只打印出jar文件:

# use constant JAR_FILE => qr/\.jar$/;

my @dir_list = ...;
my @jar_list;
find ( sub {
    return unless -f;
    return unless /\.jar$/;  #Use regex and not constant regex. 
    push @jar_list, $File::Find::name;
    }, @dir_list;

say join ": ", @jar_list;
Run Code Online (Sandbox Code Playgroud)

为什么第一个return unless JAR_FILE;不能正常工作,同时return unless $_ =~ JARFILE;return unless /\.jar$/;两个工作?

ike*_*ami 7

它与常数无关.

>perl -wE"$_ = '.txt'; say qr/\.jar$/ ?1:0;"
1

>perl -wE"$_ = '.txt'; say /\.jar$/ ?1:0;"
0

>perl -wE"$_ = '.txt'; say $_ =~ qr/\.jar$/ ?1:0;"
0
Run Code Online (Sandbox Code Playgroud)

qr//编译正则表达式模式并返回它,而匹配运算符(m//aka //)预先形成正则表达式匹配.

由于qr//始终返回true(已编译的正则表达式),return unless qr/\.jar$/;因此永远不会返回.

=~ qr/\.jar$/工作,因为=~意味着匹配运算,如果RHS操作数不匹配运算符(m//),置换运算符(s///)或转换操作符(tr///).

my $re = qr/\.jar$/;
$_ =~ $re
Run Code Online (Sandbox Code Playgroud)

是的缩写

my $re = qr/\.jar$/;
$_ =~ /$re/
Run Code Online (Sandbox Code Playgroud)

这很长

my $re = qr/\.jar$/;
/$re/
Run Code Online (Sandbox Code Playgroud)

如果省略//=~,则不再有匹配运算符.