【问题标题】:Assigning to a slice of a 3D array using the range operator使用范围运算符分配给 3D 数组的切片
【发布时间】:2016-10-04 18:59:29
【问题描述】:

我有一个 3 维数组。我想像这样设置它的三个元素:

$array[$x][$y][0 .. 2] = (0, 1, 2);

但是 perl 告诉我:

在 void 上下文中对常量 (1) 的无用使用

在数组上下文中:

@array[$x][$y][0 .. 2] = (0, 1, 2);

但是 perl 告诉我:

“][”附近的语法错误

大概意思是它希望我给它两个索引,然后作为一个单独的数组分配给第三维?但是,在this page 上,在Example: Assignment Using Array Slices 下,它表明可以使用范围运算符分配给切片:

@array1[1..3] = @array2[23..25];

如何分配给这样的数组切片,还是必须单独分配每个索引?

【问题讨论】:

标签: arrays perl slice


【解决方案1】:

你需要取消引用内部数组:

@{ $arr[$x][$y] }[ 0 .. 2 ] = (0, 1, 2);

【讨论】:

  • 范围操作符为什么返回引用?
  • 哦,我在回复中有错字。再次检查:$arr[$x][$y] 是参考。
【解决方案2】:

$array[$x][$y][0..2] 不是切片;这只是一个元素查找。

当您尝试将其更改为切片时,您切片了错误的数组。你切片 @arr 而不是 @{ $arr[$x][$y] }

这里的关键是要意识到 Perl 中没有 3d 数组这样的东西。你所拥有的是对数组的引用数组的引用数组,它通俗地称为数组数组的数组,通常缩写为 AoAoA。

数组切片的语法如下:

  • @NAME[LIST]
  • @BLOCK[LIST]
  • @$REF[LIST]
  • EXPR->@[LIST][1]

您可以使用以下任何一种:

  • 无法使用第一个语法,因为要切片的数组没有名称。
  • @{ $array[$x][$y] }[0..2] = 0..2;
  • my $ref = $array[$x][$y]; @$ref[0..2] = 0..2;
  • $array[$x][$y]->@[0..2] = 0..2;[1]

Dereferencing Syntax


  1. 需要 Perl 5.24+。通过添加 use feature qw( postderef );no warnings qw( experimental::postderef ); 在 Perl 5.20+ 中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2017-04-10
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2018-07-30
    相关资源
    最近更新 更多