加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

我可以从地图中返回多个Pa对齐哈希吗?

发布时间:2020-12-15 22:07:02 所属栏目:大数据 来源:网络整理
导读:我正在尝试创建一个按键或值查找的哈希.要查找两种方式,我希望值为键(值为键). H He == map( { state $n = 0; $n++; $n = $_.Str,$_.Str = $n } ) == my %elements;%elements.perl.say;%elements{2}.WHAT.say; 这给了我这个奇怪的事情: {"1tH Ht2" = $(2
我正在尝试创建一个按键或值查找的哈希.要查找两种方式,我希望值为键(值为键).
<
H He
>
    ==> map( {
        state $n = 0; $n++;
        $n     => $_.Str,$_.Str => $n
         } )
    ==> my %elements;

%elements.perl.say;

%elements{2}.WHAT.say;

这给了我这个奇怪的事情:

{"1tH Ht2" => $(2 => "He",:He(2))}
(Any)

只有一对,没关系:

<
H He
>
    ==> map( {
        state $n = 0; $n++;
        $n     => $_.Str
         } )
    ==> my %elements;

%elements.perl.say;

%elements{2}.WHAT.say;

现在我得到了我想要的东西,但没有反向对:

{"1" => "H","2" => "He"}
(Str)

解决方法

您的地图返回一系列 List值,每个值包含两个 Pair值.
将其提供给哈希不会自动将其展平,并且每个List都成为哈希的键或值.

有几种方法可以让它做你想要的:

使用平板

您可以使用内置的flat函数来展平地图的结果,以便哈希接收一系列对:

<H He>
==> map {
    (state $n)++;
    +$n => ~$_,~$_ => +$n
}
==> flat()
==> my %elements;

%elements.say;          # {1 => H,2 => He,H => 1,He => 2}
%elements{2}.WHAT.say;  # (Str)

map和flat都返回延迟序列,因此即使元素列表很大,这(理论上)也是内存有效的.

>旁注:我还写了$n而不是$n,因为=>对构造运算符(如List构造运算符)不会“解包”其参数 – 如果给它一个项容器,如$变量,它将直接绑定到它而不是包含在其中的值,这会导致下一个$n也会影响从上一次迭代返回的Pair.为对象构造运算符赋予值表达式而不是变量,避免了这种情况.

使用滑动

slip是平面的由内而外的版本:

<H He>
==> map {
    (state $n)++;
    slip
        +$n => ~$_,~$_ => +$n
}
==> my %elements;

地图的每次迭代现在都返回一个类型为Slip的值,它与List类似,只是它会自动溶解到它成为其中一部分的任何父列表中.

重构

如果您不依赖于您的特定方法,则有两种可能更清晰的方法来生成相同的哈希:

my @keys = 1..*;
my @values = <H He>;
my %elements = flat (@keys Z=> @values),(@values Z=> @keys);

要么:

my %elements = 1..* Z=> <H He>;
push %elements,%elements.invert;

(Z是“zip”元运算符)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读