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

con*_*con 5 perl6

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

我正在制作一个测试用例,列出以".p6 $"结尾的目录中的所有文件

此代码适用于结束字符

if 'read.p6' ~~ /read\.p6$/ {
    say "'read.p6' contains 'p6'";
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将其放入子例程中:

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

它不再有效.我不认为正则表达式的问题,但与文件名,可能有一些我不知道的属性.

如何获取文件名以匹配Perl6中的正则表达式?

Jon*_*ton 9

Regexes是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;
}
Run Code Online (Sandbox Code Playgroud)

  • @raiph是的,确实.或者为了最大限度的抽象,只需将参数设置为无类型并命名为`$ test`,它只是`for dir:$ test - > $ file {say $ file.path}`.:-) (3认同)
  • .oO(或`for dir(test => $ regex) - > $ file {say $ file.path}`if` $ regex`是`Regex`?) (2认同)