Perl:使用变量作为数组元素将主数组划分为更小的数组

时间:2015-02-04 21:52:25

标签: arrays perl

我有一个主要数组@major,我希望通过设置我想要的切片数量来划分给定数量的未成年人数组@minor(让我们在这里说4,但是我希望能够选择我想要的任何数字),就像这个伪代码: (我知道它不正确,但它有点给你这个想法)

@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 个答案:

答案 0 :(得分: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";
}

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

类似的东西(你必须稍微调整一下,以便根据你想要处理边缘情况/舍入的方式准确地得到你的想法)。