2012-01-30 75 views
1

我学习现有的Perl程序,其中包括下面的代码行:有难以理解的一块Perl代码

@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000)); 

我是如何理解这段代码很困惑。

回答

4

它是无效的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)); 

括号提供一种阵列或列表上下文;第一项是原始数组;第二项是应用于数组@shuffledsplice的结果。因此,splice从数组@shuffled中移除了几千个元素(2001?),并且整个表达式将删除的元素添加到由LHS上的复杂表达式标识的数组末尾。

它可能会更有效地写为:

push @{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000); 

这也是对打字更经济,并在脑细胞有很多更经济。

+0

感谢您指出,我已经编辑我的originial职务。 – 2012-01-30 15:45:36

+0

splice语句中的LENGTH指的是数组的长度,即元素的数量。所以它从0开始,并删除2000个元素。 – TLP 2012-01-30 16:15:43

+0

@TLP:谢谢......这个问题并不十分重要,所以我没有完全阅读完“拼接”页面(谨慎)。 – 2012-01-30 17:18:14

0

$labels是对具有三个深度(HoHoH)的哈希散列的引用。查找$labels->{$set}->{"train"}->{"negative"}返回数组引用。

希望有点帮助..

2

声明:

@{$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