我一直在尝试从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中的正则表达式匹配的文件名?
答案 0 :(得分:9)
正则表达式是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;
}