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

时间:2019-01-07 22:20:06

标签: 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中的正则表达式匹配的文件名?

1 个答案:

答案 0 :(得分:9)

正则表达式是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;
}