我一直在尝试从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$
(即带有点和美元符号)。
根据调用代码的情况,有几个选项:
- 如果您确实以字符串形式接收正则表达式,例如作为输入或从文件中读取,请使用
$file.path ~~ /<$regex>/
.这意味着它会将$regex
中的内容视为正则表达式语法。 - 如果您只是传入一系列不同的正则表达式,请将参数更改为类型
Regex
,然后执行$file.path ~~ $regex
。在这种情况下,您会像list_files_regex(/foo/)
一样传递它们。
最后但并非最不重要的一点是,dir
采用test
参数,因此您可以改为编写:
for dir(test => /<$regex>/) -> $file {
say $file.path;
}