我有这个:
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$/;两个工作?
它与常数无关.
>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)
如果省略//和=~,则不再有匹配运算符.