2015-02-04 41 views
0

我有一个主要数组@major,我想在给定数目的未成年数组中,通过设置我想要的切片数(假设4在这里,但我希望能够选择我想要的任何号码),这样的伪代码: (我知道这是不正确的,但它有点让你的想法)Perl:使用变量作为数组元素将主数组划分为更小的数组

@major = A,B,C,D,E,F,G,H,I,J 

$slice = 4; 
$arraySize = $#array + 1; 
$slicesize = $arraySize/$slice; 

@minor1 = @major[0..$slicesize] 
@minor2 = @major[($slicesize+1)..(2*$slicesize)] 
@minor3 = @major[((2*$slicesize)+1)..(3*$slicesize)] 
@minor4 = @major[((3*$slicesize)+1)..(4*$slicesize)] 

这里的目标是我希望能够改变初始数组@major的这个大小和/或片数$slice以及设置不同次要数组大小的所有值(($slicesize+1),(2*$slicesize)等)。

我知道这看起来有点复杂,但我不知道以另一种方式公开它。 你有什么想法如何实现这一目标?

+2

这可能是有趣的:http://search.cpan.org/~rehsack/List-MoreUtils-0.404/lib/List/MoreUtils.pm#part_BLOCK_LIST –

+0

是的。我还建议,对于任何复杂的数据结构来说,要走的路都是制造一个对象。 – Sobrique

回答

0

我不是很肯定你的意思是这样的,但在这里它是我理解你的观点:

#!/usr/bin/perl 

use strict; use warnings; use 5.010; 

my @array = ('A' .. 'Z'); 
my $length_of_slice = $ARGV[0] || 5 ; 

while (@array) { 
    local $" = ', '; 
    my @minor = splice @array, 0, $length_of_slice; 
    say "@minor"; 
} 
0

当你有一个复杂的数据结构的要求,我首先想到的是 - 使用一个对象。 Perl支持面向对象的编程,它允许你做所有你想做的事情这样疯狂复杂的事情。

它会去是这样的:

#!/usr/bin/perl 
use strict; 
use warnings; 

package TestObject; 

my @major = qw(A B C D E F G H I J); 

sub new { 
    my ($class, $slice_count) = @_; 
    my $self = {}; 
    if (defined $slice_count) { $self->{slice_count} = $slice_count } 
    $self->{major} = @major; 
    bless($self, $class); 
    return $self; 
} 


sub get_slices { 
    my ($self, $count) = @_; 
    my @tmp = @major; 
    my @array_of_slices; 
    for (1 .. $count) { 
     my $tmp_arr_ref =(); 
     for (0 .. (@major/$count)) { 
      if (@tmp) { push(@$tmp_arr_ref, shift(@tmp)) }; 
     } 
     push(@array_of_slices, $tmp_arr_ref); 
    } 
    return (@array_of_slices); 
} 

调用方式:

#!/usr/bin/perl 
use strict; 
use warnings; 

use TestObject; 
use Data::Dumper; 

my $first = TestObject->new(); 

my @array_of_refs = $first->get_slices(4); 
print Dumper \@array_of_refs; 

,并给予结果:

$VAR1 = [ 
      [ 
      'A', 
      'B', 
      'C' 
      ], 
      [ 
      'D', 
      'E', 
      'F' 
      ], 
      [ 
      'G', 
      'H', 
      'I' 
      ], 
      [ 
      'J' 
      ] 
     ]; 

类似的东西(你必须根据你想要处理边缘情况/舍入来调整一下,以精确地得到你想要的内容)。

+0

当你最后生产的只是一个简单的数组数组时,你为什么要关注面向对象? – GWP