【问题标题】:Perl 6: trans(%h) vs trans(%h.keys => %h.values)Perl 6:trans(%h) 与 trans(%h.keys => %h.values)
【发布时间】:2017-10-12 08:00:35
【问题描述】:

关于hash 作为trans 的参数的另一个问题。在下面的代码中,简单地采用hash 会给出不正确的结果,但将其替换为keysvalues 会使其正确。怎么了?

my @alph1 = <a+ b+ c+ d+ e+ f+>;
my @alph2 = <A_ B_ C_ D_ E_ F_>;
my %h;
%h{ @alph1 } = @alph2;

my $str = 'a+bc de+f';

my $text = $str.trans(%h);
say $text;    # A_BC DE_F (incorrect)

$text = $str.trans(%h.keys => %h.values);
say $text;    # A_bc dE_f (correct)

【问题讨论】:

    标签: raku


    【解决方案1】:

    我认为你误解了.trans 的作用。您指定要更改为其他字符字符 范围。您没有指定要更改为另一个 stringstring

    所以答案A_BC DE_F正确答案,因为aA取代,+_取代,b被取代BcC 替换,等等。

    也许我们应该引入一个.subst 的版本,它接受Hash 的匹配器和替换。同时,您可能必须创建一个遍历散列键/值的循环,并以此调用.subst。 (https://docs.raku.org/routine/subst)

    【讨论】:

    • 谢谢!!但是为什么带有.trans(%h.keys =&gt; %h.values) 的变体有效?是的,如果.subst 可以接受Hash,那就太好了。
    • 再想一想,也许不是。如果.subst 将采用Hash,您将不知道替换的顺序,因为Hash 中的键顺序在版本之间无法保证,并且可能会运行。至于为什么.trans确实采用Hash,我不确定,但感觉像是一种意想不到的副作用。
    • 伊丽莎白·马蒂森,谢谢!似乎.trans 需要一对lists 并与它们正常工作。
    猜你喜欢
    • 2013-07-11
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多