Perl6 正则表达式与文件名不匹配结束 $ 字符



我一直在尝试从Perl5中学习Perl6,但问题是正则表达式的工作方式不同,并且无法正常工作。

我正在制作一个测试用例来列出以".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 中的正则表达式匹配?

正则表达式是 Perl 6 中的一流语言,而不是简单的字符串,你在这里看到的就是这个结果。

Perl 6 正则表达式中/$foo/的形式将在 $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;
}

最新更新