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

Sicuramente e' cosa banale, ma mi riprometto di approfondire l'argomento
quando trovero' il tempo di studiare il perl con un minimo di
sistematicita'. Per il momento mi basterebbe una dritta.
In breve, in alcuni files di testo sono contenuti dati che devo
estrapolare per fare alcuni calcoli con essi.
Ogni file e' composto da 5 colonne contenenti valori interi, coi quali
devo riempire altrettanti array. Pensavo a qualcosa tipo: 
open (DATI, "dati");
while ($line = <DATI>) {
  (@a, @b, @c, @d, @e) = split("\t", $line);  # il carattere di tabulazione e'
                                              # infatti utilizzato come
                                              # separatore
}
Ora, il fatto e' che l'array viene riempito con i valori che via via
trova sulla riga, mentre io vorrei che a ciascuna colonna corrispondesse
un array. Cioe' a $a[0] deve corrispondere la cella A1, a $a[1] la
A2, a $b[0] la B1 e cosi' via (supponendo che le lettere identifichino
le colonne ed i numeri le righe).
Dove sbaglio?  (e scusate l'ignoranza)
-- 
-------------------------------------------------------------------
     Roberto Tagliarino
 
roberto.t...@multiwire.net
 
te...@bigfoot.com
-------------------------------------------------------------------

 Dove sbaglio?  (e scusate l'ignoranza)
  Non ci giuro, ma credo che qualsiasi cosa tu ottieni dallo split vada a
  finire sempre e comunque in @a, che e' una lista e quindi si succhia tutti
  i possibili dati che vengono assegnati, non lasciando nulla a @b,@c,@d ecc.
 
  Credo che tu non possa fare altro che leggerle i valori in degli scalari
  temporanei e poi spingerli negli array con dei push.
  Direi
 
 @a = ();
 @b = ();
 @c = ();
 @d = ();
 @e = ();
 while(<DATI>)
  {
    chomp;
    $line = $_;
    ( $a,$b,$c,$d,$e) = split '\t', $line;
    push @a,$a;
    push @b,$b;
    push @c,$c;
    push @d,$d;
    push @e,$e;
  }
 
 Alternativa: Leggi tutto per righe in un array di array, e poi sposti nei
 tuoi vettori leggendo l'array per colonne.
 
 Saluti,
 
 Maurizio
-- 
Maurizio M. Munafo' |                          
E-mail:mun...@hp0tlc.polito.it
 
--------------------+---------------------------------------------------------
   	     (o_    |				   - Gentile or Jew,
   (o_  (o_  //\    | O you who turn the wheel and look to windward,
   (/)_ (/)_ V_/_   | Consider Phlebas, who was once handsome and tall as you.

   }
Forse la soluzione più comoda è usare un array bidimensionale:
$riga=0;
while (<DATA>) { 
	chomp; 
	@{$Tabella[$riga++]} = split /\t/; 
	}
# stampo Tabella
for (@Tabella) {
        print join "\t", @{$_};
        print "\n";
}
# Stampo un elemento... (varianti equivalenti)
print $Tabella[0]->[2];
print $Tabella[0][2];
print ${$Tabella[0]}[2];
__DATA__
fff	qw	qwqw
qw	qwqw	qweq
qwqw	qweq	eeee

On 19 Dec 1997 20:08:55 GMT Maurizio M. Munafo' wrote:
: 
roberto.t...@multiwire.net
 wrote:
:> In breve, in alcuni files di testo sono contenuti dati che devo
:> estrapolare per fare alcuni calcoli con essi.
:> Ogni file e' composto da 5 colonne contenenti valori interi, coi quali
:> devo riempire altrettanti array. Pensavo a qualcosa tipo: 
:> open (DATI, "dati");
:> while ($line = <DATI>) {
:>   (@a, @b, @c, @d, @e) = split("\t", $line);  # il carattere di tabulazione e'
:>                                               # infatti utilizzato come
:>                                               # separatore
:> }
:   Credo che tu non possa fare altro che leggerle i valori in degli scalari
:   temporanei e poi spingerli negli array con dei push.
:   Direi
: [snip]
Semplicemente perfetto! Funziona che e' una meraviglia ...
Grazie 1000.
