Rozrzucanie wartości tablicy na n tablic.

23 stycznia, 2008

Kod, który zawsze potrzebowałem i zawsze stosowałem workaroundy. Chodzi o rozrzucenie wartości do n tablic. Przydatne przy fork(), gdzie każdy proces dostaje do obróbki swoją tablicę. Poniżej przykład, jak ładnie, szybko i deterministycznie rozrzucić te wartości.

 
#!/usr/bin/perl -w
use strict;
 
my $na_ile=5;
my @a=();
my $tmp=1;
my %data=();
 
# generujemy tablicę ze 104 elementami
for (my $i=1;$i<=104;$i++){
        push @a,$i;
}
 
# rozrzucamy elementy tablicy @a na $na_ile tablic
# $data{$tmp} to referencja do tablicy...
foreach my $value (@a){
        push @{$data{$tmp}},$value;
        print "wrzucam $value na $tmp\n";
        $tmp++;
        if ($tmp >= $na_ile){
                $tmp=1;
        }
}
 
# wyświetlanie
foreach my $tabela (sort keys %data){
        print "wyswietlam tablice nr $tabela\n";
        foreach (@{$data{$tabela}}){
                print "$_\n";
        }
}
 
 

Nawiasem, use strict i -w dla niewprawionego to wzywanie. ;/ Ale bez tego z fork() się nie poszaleje. ;)

1. x napisał(a):
23 stycznia 2008, 20:27:50

prosciej byloby my @a=(1..101);

2. night napisał(a):
23 stycznia 2008, 22:46:46

Ładne, naprawdę ładne. Zapewne wykorzystam w najbliższej przyszłości. Dzięki! :)

3. Michał Górny napisał(a):
24 stycznia 2008, 06:43:09

List::MoreUtils, funkcja part().

4. rozie napisał(a):
24 stycznia 2008, 08:01:58

x: prawda. Zwykle nie generuję tablic wypełnionych kolejnymi wartościami.
Michał: fakt, nie znałem. Tylko nie wiem, czy chce mi się 'ciągać' moduł, który zastąpi 7 linii kodu. Plus, zwykle mam do czynienia z hashami, jednak.