2010-01-14 8 views

Répondre

14

splice() fonction.

+0

Merci. Cela m'a vraiment aidé. Passer de php à perl n'est pas un travail facile :) –

+5

@Antonio: Pas facile, mais ça vaut vraiment le coup! :) – sebthebert

+0

Pourquoi n'est-ce pas un travail facile? – damog

8

Vous pouvez utiliser des tranches de tableau comme celui-ci:

#!/bin/perl -l 

my @array = (1,2,3,4,5,6,7,8,9); 

print join ",", @array[0..2]; 
print join ",", @array[3..5]; 
print join ",", @array[6..$#array]; 
3

Pour correspondre à la fonction PHP, vous pouvez utiliser un certain nombre d'approches:

use strict; 
use warnings; 

use List::MoreUtils qw(natatime part); 

use Data::Dumper; 

my @array = 0..9; 
my $size = 3; 

{ my $i = 0; 
    my @part = part { int($i++/$size) } @array; 
    warn "PART\n"; 
    warn Dumper \@part; 
} 

{ my $iter = natatime($size, @array); 
    my @natatime; 
    while(my @chunk = $iter->()) { 
     push @natatime, \@chunk; 
    } 
    warn "NATATIME\n"; 
    warn Dumper \@natatime; 
} 

{ my @manual; 
    my $i = 0; 

    for(0..$#array) { 
     my $row = int($_/$size); 

     $manual[$row] = [] 
      unless exists $manual[$row]; 

     push @{$manual[$row]}, $array[$_]; 
    } 

    warn "MANUAL:\n"; 
    warn Dumper \@manual; 
} 
2

Une des façons plus facile est d'utiliser List::MoreUtils et soit les fonctions natatime ou part.

Avec natatime, il crée un itérateur, donc cela pourrait ne pas être ce que vous voulez:

my $iter = natatime 3, @orig_list; 

Et chaque appel à $iter->() renvoie 3 éléments dans la liste. Il y a ensuite part.

my $i  = 0; 
my @groups = part { int($i++/3) } @orig_array; 

Si vous voulez vous faciliter la tâche, vous pouvez écrire votre propre fonction: chunk_array.

sub chunk_array { 
    my $size = shift; 
    my $i = 0; 
    return part { int($i++/$size) } @_; 
} 

Et vous appelez aussi simple que:

my @trios = chunk_array(3, @orig_array); 
Questions connexes