Newsgroup: it.comp.lang.perl
Titolo: matrici

ciao
ho il seguente codice :
  # (use strict)
  while ( @SELECT = $restituiscearray() ) {
	my $aref = [ @SELECT ];
	push (@matrice,$aref);
	}
  my $c;
  for $c(@matrice) {
    print STDOUT "\t [ @$c ], \n";
    }
e mi da il seguente errore :
Can't use string ("") as an ARRAY ref while "strict refs" in use
quando stampo.
HELP!
 Raffaello

     }
Ho risolto : era colpa di "use strict;"
Ho dovuto aggiungere 2 linee :
no strict 'refs' ; # <<<<<
my $c;
for $c(@matrice) {
    print STDOUT "\t [ @$c ], \n";
    }
use strict 'refs' ; # <<<<<
 Raffaello

 Ho risolto : era colpa di "use strict;"
Secondo me no. strict segnala qualcosa che potrebbe essere
un errore. Il seguente codice, che per quanto riguarda la
stampa e` del tutto analogo al tuo, funziona senza generare
errori ne` warning.
   use strict;
   use warnings;
   my @matrice = (
       [ 1, 2, 3 ],
       [ 3, 4, 5 ],
       [ 6, 7, 8 ]
   );
   foreach my $r ( @matrice ) {
       print " [ @$r ]\n";
   }
Piuttosto, ho dei dubbi sul pezzo di codice che riempie
@matrice:
 >>  while ( @SELECT = $restituiscearray() ) {
 >>	my $aref = [ @SELECT ];
 >>	push (@matrice,$aref);
 >>	}
cosa intendi con @SELECT = $restituiscearray() ?
Se $restituiscearray contiene un riferimeto a
codice, devi scrivere $restituiscecodice->().
ciao
Stefano

 cosa intendi con @SELECT = $restituiscearray() ?
Ho sbagliato a ricopiare il codice : e'
@SELECT = restituiscearray()
ovvero restituiscearray e' una funzione che carica il vettore
di volta in volta. Nella fattispecie sto caricando dei dati da
un DB :
  while ( @SELECT = $sth->fetchrow_array() ) {
  ....
  }
 Raffaello

quando stampo.
Se tu ci dessi un esempio di codice, d'accordo minimale, ma che almeno
riproduca l'errore senza costringere ad acrobazie psioniche, magari si
riuscirebbe a dire qualcosa di più.
Per come stanno le cose, tutto quello che capisco io è che una qualche
variabile (probabilmente un elemento di @matrice), che lessicalmente
dovrebbe essere un reference ad un array, contiene la stringa nulla e non
un reference ad un array. Questo accade probabilmente in uno dei tanti
punti del codice non pubblicato di cui non ci dici nulla (che cosa sarebbe,
per esempio "$restituiscearray()"?), perché appare difficile che accada nel
brano pubblicato.
Ciao.

no strict 'refs' ; # <<<<<
Questo rende leggittime le "symbolic reference". Vale a dire, dato:
     $nome = "foo";
     @foo = ("uno", "due", "tre");
allora @{$nome} contiene ("uno", "due", "tre"). Cioè il nome della variabile
viene considerato un riferimento al contenuto (sempre che si tratti di
variabili di cui è noto il nome, cioè non variabili lessicali definite con
my). Difficilmente questo è quello che vuoi. Anche perché l'errore era:
   Can't use string ("") as an ARRAY ref while "strict refs" in use
Vale a dire, il nome della variabile sarebbe la stringa nulla (""), che
probabilmente viene benevolmente considerata una symbolic reference alla
lista nulla. E, di nuovo, difficilmente questo è qullo che vuoi, anche se
effettivamente "tutto va liscio" e non ricevi errori né avvertimenti. E, in
ogni caso, dovresti ottenere la riga:
      [ ]
che, probabilmente, non è precisamente quello che vuoi.
Ma quello che da più da pensare è questo:
  while ( @SELECT = restituiscearray() ) {
       my $aref = [ @SELECT ];
       push (@matrice,$aref);
  }
perché, non c'è verso, le parentesi quadre sono un costruttore di array, e
qualsiasi cosa ci metti dentro diventa un array, sicché non si riesce a
capire come fai, in seguito, a trovarci una stringa[1]. Io ci ho pure
provato, nonostante il fortissimo pregiudizio: non dico di avere tentato
tutto il tentabile, ma ho verificato tutti i candidati più probabili, e non
mi è comunque mai riuscito di ottenere come elemento di @matrice uno
scalare. Di qui la legittima suspicione che tu ci tenga nascosto qualcosa.
Ciao.
[1] Ad ogni buon conto, il my può benissimo essere portato fuori dal while:
  my $aref;
  while ( @SELECT = restituiscearray() ) {
       $aref = [ @SELECT ];
       push (@matrice,$aref);
  }
Non c'è nessun motivo di creare nuove variabili a tutto spiano, quando si
utilizza solo il valore. Diverso sarebbe stato se tu avessi fatto: 
  my $aref;
  while () {
       my @SELECT = restituiscearray();
       last if (!defined @SELECT);
       $aref = \@SELECT;
       push (@matrice, $aref);
  }
Ciao.

 Di qui la legittima suspicione che tu ci tenga nascosto qualcosa.
In effetti il progetto e' Top Secret. ;)
Comunque l'hai beccato.
Avevo inizializzato la matrice cosi' :
my @matrice = "";
invece che
my @matrice = ();
da qui tutto il casino che ne consegue.
Grazie per l'attenzione ed i consigli (e lo stress).
 Raffaello