у меня есть это:Perl Constant, кажется, не работает
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;
Это выводит все файлы в @dir_list
- банка файлах и не баночка файлах;
Однако это:
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;
печатает только файлы банку.
И это также выводит только банку файлы:
# 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;
Почему первый один return unless JAR_FILE;
не работать, пока return unless $_ =~ JARFILE;
и return unless /\.jar$/;
и работу?
Я думаю, главное в том, что '' т /../ неявно предполагает матч против '$ _', если вы не укажете' = ~ 'так же, как '-f' предполагает, что он должен проверить' $ _', если вы не укажете проверяемую переменную. Это один из немногих раз, когда я буду использовать этот тип неявного '$ _'. Обычно я расскажу людям, чтобы они не делали подобные вещи, потому что это сломается, когда вы меньше всего этого ожидаете. Как в этой ситуации. –
Ты все еще думаешь, что все это неправильно. Почему постоянная причина регулярного выражения? Главное, что qr // не вызывает никакого совпадения вообще. Добавил немного моего ответа, чтобы подробно остановиться на этом. – ikegami