为什么数组数组保留我的初始数组?
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
散列元素的值是标量。
您可以在标量中存储对数组的引用,但不能在标量中存储数组。
- 好吧,可以向
@flags
添加魔法,在访问时抛出异常。但是你真的想忽略这个异常吗?我不明白你为什么在这里使用 eval
。
所以我有这段代码:
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
散列元素的值是标量。
您可以在标量中存储对数组的引用,但不能在标量中存储数组。
- 好吧,可以向
@flags
添加魔法,在访问时抛出异常。但是你真的想忽略这个异常吗?我不明白你为什么在这里使用eval
。