难以理解一段Perl代码

时间:2012-01-30 15:20:18

标签: perl

我正在研究现有的Perl程序,其中包括以下代码行:

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

我对如何理解这段代码感到很困惑。

3 个答案:

答案 0 :(得分:4)

编写的Perl无效:

@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}};
                                              ^
Syntax error - open parenthesis without a matching close parenthesis

如果忽略左括号,那么LHS和RHS表达式是相同的;它为自己分配一个数组值。箭头->{}符号主要是指您在哈希引用哈希引用或其附近的哈希引用结束时处理数组引用。这是一个令人讨厌的代码,最多只能理解,但结构可能在整个程序的更大背景下更有意义(整个程序将会更大,所以我不建议在这里发布)


仔细检查你的副本'n'。如果它实际上是在Perl脚本中,则它不能被编译,更不用说执行了,所以你必须弄清楚该行无法操作的方式和原因。

修订后的表达式有RHS:

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

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

它可能会更有效地写成:

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

它在打字方面也更经济,而且对脑细胞更经济。

答案 1 :(得分: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;

正如您将注意到的,splice中的LENGTH不是数组元素的数量,而是数组的长度,这就是上面数组切片中计数为一的原因。

正如Jonathan指出的那样,使用push会更简单。

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

文档:splice

答案 2 :(得分:0)

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

希望有所帮助..