Perl6 регулярное выражение не соответствует символу конца $ с именами файлов - PullRequest
0 голосов
/ 08 января 2019

Я пытался изучить Perl6 из Perl5, но проблема в том, что регулярное выражение работает по-другому и не работает должным образом.

Я делаю тестовый пример, чтобы вывести список всех файлов в каталоге, заканчивающемся на ".p6 $"

Этот код работает с конечным символом

if 'read.p6' ~~ /read\.p6$/ {
    say "'read.p6' contains 'p6'";
}

Однако, если я попытаюсь поместить это в подпрограмму:

multi list_files_regex (Str $regex) {
  my @files = dir;
  for @files -> $file {
    if $file.path ~~ /$regex/ {
      say $file.path;
    }
  }
}

больше не работает. Я не думаю, что проблема с регулярным выражением, но с именем файла, может быть какой-то атрибут, о котором я не знаю.

Как я могу получить имя файла, совпадающее с регулярным выражением в Perl6?

1 Ответ

0 голосов
/ 08 января 2019

Регулярные выражения - это первоклассный язык в Perl 6, а не просто строки, и то, что вы видите здесь, является результатом этого.

Форма /$foo/ в регулярном выражении Perl 6 будет искать строковое значение в $foo, поэтому она будет искать буквально символы read\.p6$ (то есть со знаком точки и доллара).

В зависимости от ситуации с вызывающим кодом, существует несколько вариантов:

  1. Если вы действительно получаете регулярные выражения в виде строк, например, читаете как ввод или из файла, тогда используйте $file.path ~~ /<$regex>/. Это означает, что он будет обрабатывать то, что в $regex, как синтаксис регулярных выражений.
  2. Если вы просто будете передавать диапазон различных регулярных выражений, измените параметр на тип Regex, а затем выполните $file.path ~~ $regex. В этом случае вы передадите их как list_files_regex(/foo/).

И последнее, но не менее важное: dir принимает параметр test, поэтому вместо него можно написать:

for dir(test => /<$regex>/) -> $file {
    say $file.path;
}
...