为什么数组数组保留我的初始数组?

Why an array of array preserves my initial array?

所以我有这段代码:

push @{$savedcallouts[-1]}, {
$funcnm => {
    matches => {%$captures},
    flags => [eval { @flags}]
}};
print Dumper \@{$savedcallouts[-1]};

结果如下:

$VAR1 = [
          [
            {
              'normalexpr' => undef
            },
            {
              'normalexpr' => undef
            },
            {
              'ternaryexpr' => undef
            }
          ]
        ];

但是如果我删除 flags => [eval { @flags}] 的方括号(即有 flags => eval { @flags} - 我得到这个:

$VAR1 = {
          'begin_binary' => {
                              'HASH(0x1038301c0)' => {
                                                       'ternaryexpr' => undef
                                                     },
                              'flags' => {
                                           'normalexpr' => undef
                                         },
                              'matches' => {}
                            }
        };

任何想法为什么会发生这种情况以及我如何可能避免 - 即直接将数组作为散列字段而不使用工件或作为嵌套数组。

首先,eval { }在这里是没有用的。 @flags 不会抛出任何异常。[1]

所以

flags => eval { @flags }

写法很奇怪

flags => @flags

flags => @flags

是shorthand

"flags", @flags

这是

"flags", $flags[0], $flags[1], $flags[2], ...

这是

"flags"   => $flags[0],
$flags[1] => $flags[2],
...

have the array as hash field directly

散列元素的值是标量。

您可以在标量中存储对数组的引用,但不能在标量中存储数组。


  1. 好吧,可以向 @flags 添加魔法,在访问时抛出异常。但是你真的想忽略这个异常吗?我不明白你为什么在这里使用 eval