【问题标题】:Sub-setting an Array子设置数组
【发布时间】:2015-09-04 23:35:10
【问题描述】:

我正在尝试使用splice 来获取一个数组,该数组是另一个数组的子集,但有些东西不起作用。以下代码为 splice (1, -3) 的一对参数返回值 67,而不是数组 34 67。为什么?

#!/usr/bin/perl

my @a = (99999, 34,67,976,432,99999);
my $length = scalar(@a);

for ($counter = 0; $counter<=$length; $counter++){
    my $max = max(-3 + $counter, 1);
    print "$max\n";
    my $second_counter = -($length - $counter);
    print "$second_counter\n";
    my @worker = splice @a, $max, $second_counter;
    print "@worker\n";
}

【问题讨论】:

  • splice @a, 1, -3 确实在该数组中返回(34, 67),问题出在计数器的其他地方,而不是splice。代码正在运行,按照您的要求执行 :-) 问题:您是否希望在第一次迭代中实现 1, -3
  • @sidyll 不,我不希望它在第一次迭代中实现,但我只是不明白 for 循环怎么可能不返回这个子集应该的初始数组。

标签: arrays perl subset


【解决方案1】:

Splice 删除(或替换)数组中的内容;在我看来,您只想使用切片:

my $second_counter = $counter - 1;
my @worker = @a[$max..$second_counter];

但我并不清楚你是否正在使用 $second_counter 做你认为你所做的事情。

【讨论】:

  • @g_puffo 很好,我执行了你的代码,我看到在到达1, -3 之前,参数通过1, -4。这将从数组中删除 34。正如 ysth 这里所说,不要忘记 splice 删除元素。在你的循环中,当到达1, -3 时,列表已经不同了。在列表上下文中splice 也返回删除的元素,所以这可能会让您感到困惑?
  • 但是,即使我使用my @worker = @a[$max..$second_counter]; 而不是splice,当for 循环进入时,代码仍然不会返回正确的子集。我不知道在@a 上使用splice 实际上是在更改原始数组。
  • @g_puffo splice 的参数在数组切片中的工作方式不同。检查你的数学!并查看数组切片的帮助。请注意,ysth 也更改了 $second_counter 代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多