【问题标题】:Slicing a reference of array切片数组的引用
【发布时间】:2017-10-29 14:03:37
【问题描述】:

我有以下地图:

my %cps_per_level = (
                     Bronze      =>  [100 , 65  ],
                     Silver      =>  [200 , 125 ],
                     Gold        =>  [400 , 250 ],
                     Platinum    =>  [800 , 500 ],
                     Diamond     =>  [1200, 750 ],
                     Master      =>  [2000, 1200],
                     Grandmaster =>  [3000, 1750],
                );

在我的代码中,我想获取 2 个变量的特定条目的列表的两个值。我的第一次尝试是取消引用特定条目的列表,然后应用列表切片并将其分配给我想要的变量,如下所示。这里$level 持有地图的一个键。

my ($cps_before, $cps_after) = $cps_per_level{$level}[0,1];

但这不起作用。 $cps_before 获得列表的第一个值,但 $cps_after 什么也得不到。我设法通过用两行编写它来使其工作:

my $cps_before= $cps_per_level{$level}[0];
my $cps_after = $cps_per_level{$level}[1];

我的问题是:为什么切片不起作用?我错过了什么?

【问题讨论】:

    标签: arrays perl reference slice


    【解决方案1】:

    那不是一片。如果您有一个@array,切片将如下所示:

    @array[0, 1, 2]
    

    你写的就是这样的:

    $array[0, 1, 2]
    

    ...在标量上下文中使用,,等效于$array[2]

    其实

    $cps_per_level{$level}[0,1]
    

    是简写

    $cps_per_level{$level}->[0,1]
    

    这是语法糖

    ${ $cps_per_level{$level} }[0, 1]
    

    这只是意味着

    ${ $cps_per_level{$level} }[1]
    

    你应该做的是:

    @{ $cps_per_level{$level} }[0, 1]
    

    @ 表示您正在尝试取出多个元素。

    如果您的 perl 足够新(5.20 并且自 5.24 起不再是实验性的),您还可以使用像这样的后缀取消引用形式:

    $cps_per_level{$level}->@[0, 1]
    

    【讨论】:

    • 知道了,谢谢你的回答。对于我所看到的,您使用@{...} 取消引用列表,然后将切片应用于列表的取消引用版本,这非常有意义。我想我的错误是认为->(以及它的语法糖版本{...}[...])会自动取消引用任何内容,而不是使其成为${thing_to_derefence}[...]
    • @AndréSantos @[] 不是独立的结构。 @ ... [ ] 是数组切片的语法。还有一个列表切片运算符,拼写为( ... )[ ]。但是你不能单独拥有[] 的下标;它总是一些更大的结构的一部分。
    猜你喜欢
    • 2012-03-20
    • 2012-11-10
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多