代码之家  ›  专栏  ›  技术社区  ›  CJ7

一个语句中数组内的取消引用数组?

  •  0
  • CJ7  · 技术社区  · 9 年前
    @arr1 = ([1,2,3], 4, 5, 6);
    $arr_ref = $arr1[0];
    @arr2 = @$arr_ref;
    

    是否可以在一个语句中完成第2行和第3行?

    我已经试过了 @arr2 = @$arr1[0]; 但它不能编译。

    1 回复  |  直到 8 年前
        1
  •  5
  •   Community CDub    8 年前

    由于优先规则,您必须添加大括号

    @arr2 = @{$arr1[0]};
    

    从…起 perldsc, Caveat on precedence

    说到这样的事情 @{$AoA[$i]}
    [ ... ]
    这是因为Perl对其五个前缀解引用器(看起来像是在咒骂: $ @ * % & )使它们比后缀下标括号或大括号更紧密地绑定!


    这意味着如果不需要显式索引,则不需要 {} 例如,在检索数组元素的代码中。例如,要展平内部有arrayrefs的数组,根据 Sobrique 的注释

    @all_elems = map { ref $_ eq "ARRAY" ? @$_ : $_ } @arr1;
    

    要检索只能使用的arrayrefs的内容 : () 而不是 : $_ 在块内的三元运算符中。这个 () 返回一个空列表,该列表在结果中变平,因此不会影响它。(当条件评估为false时 某物 必须退回。这个技巧允许 map 要做的 grep 的工作,有效过滤。)