Newsgroup: it.comp.lang.perl
Titolo: Tie di array di array

Salve,
ho la necessità di fare un tie di un array a 2 dim.
Al momento, con le librerie disponibile non è possibile farlo.
Cioè, mi serve un tie di un vettore che se faccio così:
@vettore[10][100]
la funzione STORE prende come parametri:
this, chiave1, chiave2,valore
Esiste qualcosa di simile?
Grazie in anticipo ^^ 

 this, chiave1, chiave2,valore
Come hai detto giustamente, questo non si può fare in maniera diretta in 
Perl, perché non puoi fare il tie di tipi composti (quale sarebbe un 
array di array).
Però puoi ottenere esattamente la stessa cosa, con un piccolo magheggio 
di carattere matematico, diciamo.
Infatti si può osservare che una matrice MxN si può sempre serializzare 
in un array (monodimensionale) di M*N elementi.
Quindi è sufficiente fare il tie di un array (semplice), prendere 
l'indice dell'elemento dell'array che viene passato al metodo STORE, e 
da questo risalire ai 2 indici dell'elemento corrispondente della 
matrice bidimensionale idealmente mappata su di esso: quindi in pratica 
è proprio come se venissero passati a STORE i 2 indici che chiedi tu.
Stabilendo di mappare la matrice sull'array /per righe/, la subroutine 
che restituisce i 2 indici dell'elemento della matrice corrispondente 
all'elemento dell'array è la seguente:
sub inv_map {
     my ($k, $N) = @_;
     # $k = idice dell'array (passato a STORE).
     # $N = numero di colonne della matrice.
     my $j = $k % $N;
     my $i = ($k - $j) / $N;
     # Indici dell'elemento della matrice (riga, colonna).
     return ($i, $j)
}
Ciao,
Emanuele.
-- 
What does VISTA mean?
Viruses, Infections, Spyware, Trojan horses & Adware.

E' che non conosco la dim a priori della matrice iniziale.
In pratica, il mio scopo è quello di creare una libreria che permetta di 
creare vettori, che pero' condivino tra loro alcune celle.
In pratica, io dico al mio primo vettore che si trova nella posizione 10,5 
del padre ed è 10x10.
Il secondo vettore è nella posizione 15,10 del padre ed è anche esso 10x10.
Quando io vado a cambiare
$secondo[0][0]=2; # Equivalente a $padre[10][5]
è come fare.
$primo[5][5]=2
E' difficile da spiegare, anche perchè sono le 3.31 di mattina.
In pratica è come avere una superfice grande, ed io in da qualche parte su 
questa superficio disegno dei rettangoli. Alcuni rettangoli possono 
condivedere una parte della superficile.
Quando vado ad usare un indice sui rettangolini uso le cordinate relative al 
rettangolino.
Questa cosa pensavo di risolverla usando i tie.
Grazie mille dell'aiuto Ema, ora provo
"Emanuele Zeppieri" <emazep@REMOVE_THIStiscali.it> ha scritto nel messaggio 
news:OqsOg.108894$_J1.8...@twister2.libero.it...


Risolto mentre dormivo °_°
OUTPUT:
use strict;
my $padre=[];
$padre->[2]->[2]='hahaha';
my $figlio=new ALFA($padre,0,0,9,9);
$figlio->[2]->[2]='ciao mondo';
my $figlio2=new ALFA($padre,2,2,9,9);
print $figlio2->[0]->[0];
<stdin>;
package ALFA;
sub new {
    my ($classe,$padre,$x,$y,$h,$w)=@_;
    my $figlio;
    my $hash={padre=>$padre,x=>$x,y=>$y,h=>$h,w=>$w};
    tie(@$figlio, 'ALFA', $hash);
    return $figlio;
}
sub TIEARRAY {
    my ($classe,$hash)=@_;
    bless($hash,$classe);
    return $hash;
}
sub FETCH {
    my ($this,$chiave)=@_;
    print "FETCH CON ALFA chiave $chiave\n";
    my $sub;
    tie(@$sub,'BETA',$this,$chiave+$this->{x});
    return $sub;
}
package BETA;
sub TIEARRAY {
    my ($classe,$hash,$chiave)=@_;
    print "TIEARRAY DI BETA $chiave\n";
    my $sub=bless({HASH=>$hash,K=>$chiave},'BETA');
    return $sub;
}
sub STORE {
    my ($this,$chiave,$valore)=@_;
    my $orig=$this->{HASH};
    $orig->{padre}->[$this->{K}]->[$chiave+$orig->{y}]=$valore;
}
sub FETCH {
    my ($this,$chiave)=@_;
    my $orig=$this->{HASH};
    return $orig->{padre}->[$this->{K}]->[$chiave+$orig->{y}];
}
"Emanuele Zeppieri" <emazep@REMOVE_THIStiscali.it> ha scritto nel messaggio 
news:OqsOg.108894$_J1.8...@twister2.libero.it...


OPutput:
FETCH CON ALFA chiave 2
TIEARRAY DI BETA 2
FETCH CON ALFA chiave 0
TIEARRAY DI BETA 2
ciao mondo