我学习现有的Perl程序,其中包括下面的代码行:有难以理解的一块Perl代码
@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));
我是如何理解这段代码很困惑。
我学习现有的Perl程序,其中包括下面的代码行:有难以理解的一块Perl代码
@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));
我是如何理解这段代码很困惑。
它是无效的Perl书面:
@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}};
^
Syntax error - open parenthesis without a matching close parenthesis
如果忽略左括号,那么LHS和RHS表达式是相同的;它为它自己分配一个数组值。箭头->
和{}
表示法大多意味着您正在处理哈希引用散列引用末尾处的数组ref,或其附近。这是一个令人讨厌的代码,至多要理解,但是在整个程序的更大范围内,结构可能更有意义(并且整个程序会更大,所以我不建议在此处发布) 。
仔细检查你的copy'n'paste。如果这实际上是在Perl脚本中,那么它不能被编译,执行得更少,所以你必须弄清楚这条线路是如何以及为什么不能操作的。
订正表达式具有RHS:
(@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));
括号提供一种阵列或列表上下文;第一项是原始数组;第二项是应用于数组@shuffled
的splice
的结果。因此,splice
从数组@shuffled
中移除了几千个元素(2001?),并且整个表达式将删除的元素添加到由LHS上的复杂表达式标识的数组末尾。
它可能会更有效地写为:
push @{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000);
这也是对打字更经济,并在脑细胞有很多更经济。
$labels
是对具有三个深度(HoHoH)的哈希散列的引用。查找$labels->{$set}->{"train"}->{"negative"}
返回数组引用。
希望有点帮助..
声明:
@{$labels->{$set}->{"train"}->{"negative"}} =
(@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));
一次会做很多的事情。它也可以写,稍微详细:
my @array = @{$labels->{$set}->{"train"}->{"negative"}};
my @values = @shuffled[0..1999]; # get the first 2000 values
splice @shuffled, 0, 2000; # delete the values after use
@array = (@array, @values); # add the values to the array
@{$labels->{$set}->{"train"}->{"negative"}} = @array;
正如你会发现,在剪接的长度不是数组元素的数量,但数组的长度,这就是为什么计数为1关闭上面的数组切片。
正如Jonathan指出的那样,使用push比较简单。
push @{$labels->{$set}{"train"}{"negative"}}, splice(@shuffled, 0, 2000);
文档:splice
感谢您指出,我已经编辑我的originial职务。 – 2012-01-30 15:45:36
splice语句中的LENGTH指的是数组的长度,即元素的数量。所以它从0开始,并删除2000个元素。 – TLP 2012-01-30 16:15:43
@TLP:谢谢......这个问题并不十分重要,所以我没有完全阅读完“拼接”页面(谨慎)。 – 2012-01-30 17:18:14