在 perl6 中将匹配对象转换为字符串
Posted
技术标签:
【中文标题】在 perl6 中将匹配对象转换为字符串【英文标题】:Converting match object to string in perl6 【发布时间】:2019-01-05 08:34:58 【问题描述】:我试图。匹配对象上的方法 Str 定义为:
method Str(Match:D: --> Str:D)
我认为我可以使用 Str($match) 来完成此操作。它似乎将其转换为字符串,但使用带有以下代码的字符串时出现错误:
my $searchme = "rudolph";
my $match = $searchme ~~ /.*dol.*/;
say $match.WHAT;
my $test1 = Str($match);
say $test1.WHAT;
say $test1;
输出:
(Match)
(Str)
出现错误:
找不到方法“gist”:没有方法缓存,也没有 .^find_method in 在 .code.tio 第 6 行阻止
但是,如果我运行:
my $searchme = "rudolph";
my $match = $searchme ~~ /.*dol.*/;
say $match.WHAT;
my $test1 = $match.Str;
say $test1.WHAT;
say $test1;
我没有得到任何错误和结果:
(Match)
(Str)
rudolph
这是一个错误还是我误解了它的工作原理?
感谢阅读。
【问题讨论】:
这是一个错误。也许您刚刚打了高尔夫球this。dd $test1;
而不是 say $test1;
很有帮助,因为它显示 BOOTStr $test1 = (BOOTStr without .perl method)
。基于此,我searched the rakudo repo for BOOTStr
导致了上述问题。我会尝试进一步打高尔夫球,但我想我会在此期间发表此评论。
顺便说一句,我通常使用~
来强制匹配字符串。 my $text = ~$match
【参考方案1】:
我将其写为答案,尽管它实际上是对错误的不完整讨论,因此根本不是正常的 SO 票价。许多 cmets 的替代方案似乎并不好。
这是一个错误。也许你刚刚打了高尔夫球this。
dd $test1;
代替 say $test1;
很有帮助,因为它显示 BOOTStr $test1 = (BOOTStr without .perl method)
。
基于我searched the rakudo repo for BOOTStr
并导致了上述问题。
进一步打高尔夫球会导致:
say $ = Str(Match.new);
请注意,这些都很好:
say Str(Match.new);
say $ = Int(Match.new);
say $ = Str(Date.new: '2015-12-31');
这似乎是泄露有关 Rakudo/NQP/MoarVM 如何引导的一些实现细节的组合; Match
是一个 NQP 对象; Str()
不可靠;并将其分配给Scalar
容器($
是一个匿名容器),从而使这种不稳定可见。
当/如果我弄明白了,我会添加更多。
【讨论】:
太好了,谢谢。为我清除它。我会假设它是那个错误而不是发布它。干杯以上是关于在 perl6 中将匹配对象转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章