Newsgroup: it.comp.lang.perl
Titolo: Hash di references a matrici

Ho un piccolo problema con la gestione delle matrici bidimensionali.
In pratica ho un'array i cui elementi sono le righe di quelle che
vorrei
diventassero delle matrici (di dimensione diversa).
Per fare questo uso una matrice temporanea, che riempio con le prime
righe di questo array. Arrivato a questo punto vorrei avere la matrice
cosi' ottenuta in una matrice distinta (o ancora meglio all'interno di
hash
di matrici) per poi ri-inizializzare la matrice temporanea e
ricominciare
con questa procedura e riempire la matrice temporanea con gli elementi
della seconda matrice.
Qualcuno ha qualche indicazione su come procedere?
Grazie.
Alessandro

 
Spieghi (piů o meno) quello che devi ottenere, ma non spieghi quali sono i 
problemi in cui ti sei imbattuto.
Vediamo un po'.
Diciamo che abbiamo un array fatto cosě:
 my @array = ( [ 1,2,3,4,5] , [7,8,9,0,1], [3,4,5,6,7], [8,9,0,1,2] );
Vogliamo creare un nuovo array con una *copia* delle prime 2 righe, e 
inserirlo come valore in un hash:
  $hash{ prime_due_righe } = 
                [   
                        [ @{ $array[0] } ],
                        [ @{ $array[1] } ],
                 ];
oppure
  $hash{ prime_due_righe } = [ map { [ @$_ ] } @array[ 0, 1 ] ];
Spero di aver capito. Ovviamente se non vuoi fare delle copie, ma inserire 
direttamente i riferimenti alle due righe, il codice č piů semplice:
  $hash{ prime_due_righe } = [   @array[0,1]   ];
Max

 Ho un piccolo problema con la gestione delle matrici bidimensionali.
 > [...]
Neanche io ho capito bene quale sia il problema che ti impedisce di fare 
quello che hai descritto.
Assumo che si tratti del fatto che non riesci a fare una *copia* (cioè 
una vera duplicazione) della tua matrice d'appoggio (o meglio del fatto 
che desideri fare tale copia in maniera /semplice/).
Se il problema è questo, una soluzione alternativa a quanto ti è già 
stato proposto è quella di utilizzare il metodo dclone() del modulo 
standard Storable.
dclone() peraltro permette di duplicare strutture di dati nidificate 
arbitrariamente complesse, non soltanto matrici bidimensionali, sempre 
con una singola assegnazione.
Esempio:
use strict;
use warnings;
my @matrice = (
     [11, 12, 13],
     [21, 22, 23],
     [31, 32, 33]
);
use Storable qw(dclone);
my @copia_matrice = @{ dclone(\@matrice) };
# Ora resetto @matrice...
undef @matrice;
# ... Ma @copia_matrice rimane intatta!
foreach my $riga ( @copia_matrice ) {
     print "$_  " for @$riga;
     print "\n"
}
__END__
Se poi le tue matrici sono implementate come array reference:
     my $matrice = [
         [11, 12, 13],
         [21, 22, 23],
         [31, 32, 33]
     ];
allora la copia con dclone() è ancora più semplice:
     my $copia_matrice = dclone($matrice);
Ciao,
Emanuele.

 }
Quest'esempio forse non è dei più felici.
E' più significativo far vedere che assegnando nuovi valori agli 
elementi di @matrice, @copia_matrice non viene alterata:
# Ora modifico @matrice...
$matrice[2][2] = 'prrr!';
# ... Ma @copia_matrice rimane inalterata!
foreach my $riga ( @copia_matrice ) {
      print "$_  " for @$riga;
      print "\n"
}
Ciao,
Emanuele.

Grazie mille a tutti!
Ignoravo il comando map (ed anche il metodo dclone).
Ora ho risolto.
Alessandro