【问题标题】:Perl6 regex not matching end $ character with filenamesPerl6 正则表达式与文件名不匹配结束 $ 字符
【发布时间】:2023-04-01 00:25:01
【问题描述】:

我一直在尝试从 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 中的正则表达式?

【问题讨论】:

    标签: raku


    【解决方案1】:

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

    【讨论】:

    • .oO(如果$regexRegex,则为for dir(test =&gt; $regex) -&gt; $file { say $file.path }?)
    • @raiph 是的,确实如此。或者为了最大限度地抽象,只需将参数设为无类型并将其命名为$test,它只是for dir :$test -&gt; $file { say $file.path }。 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多