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

Ho l'esigenza di togliere da una lista di nomi, dei nomi inseriti in un
altra lista. 
Esempio:
Lista 1
marco
matteo
mario
john
Lista 2 
Marco
john
Devo creare uno script che tolga leggendi la Lista 2 i nonmi che sono
presenti nella lista 1
questo script, vede la presenza di john nella lista 2 e li rimuove nella
lista 1
Risultato finale nella lista 1 rimangono:
Lista 1
matteo
mario
mateo e marco.
Riesco a fare l'append (>>) l'inserimento (>) ma non riesco a rimuoverli.
Qualcuno può aiutarmi.
Grazie
Saluti
------------------------------------------------------------------------------
Matteo Colombo 	      	E-mail: 
mat...@calcol.it
 
------------------------------------------------------------------------------
--
Automatic posted from 
ro...@dns.calcol.it
 [195.129.25.201]
via Mailgate Server - 
http://www.mailgate.org

 Qualcuno puņ aiutarmi.
 Mi sembra che ci dai troppo pochi dati.
 Le liste sono su file? O sono in memoria? O una e' in memoria e l'altra su
 file?
 Se sono su file, ti puoi permetterere di riscrivere il file o no?
 Sono ordinate o sono casuali?
 
 Se posti il codice che hai cercato di usare, nei limiti ragionevoli di
 lunghezza, forse ti si puo' aiutare.
 
 Buttandola li' un po' a caso, direi che se metti la prima lista in un hash
 e poi controlli se nell'hash esistono gli elementi della seconda lista, puoi
 eventualmente cancellarli e riscrivere su file tutto quello che resta.
 Naturalmente se la lista non deve essere in ordine rigido.
 
 Con una lista ordinata potresti pensare di usare un array, ma poi e' un po'
 incasinato inserire e cancellare elementi dal mezzo.
 
 Maurizio
-- 
Maurizio M. Munafo' |                            
E-mail:mmmu...@tuttocitta.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.

 wrote:
: Ho l'esigenza di togliere da una lista di nomi, dei nomi inseriti in un
: altra lista. 
     1	#!/usr/bin/perl
     2	
     3	open L1, "lista1" or die;
     4	while(<L1>){
     5		chomp;
     6		$lista{$_} = 1;
     7	}
     8	close L1;
     9	
    10	open L2, "lista2" or die;
    11	while(<L2>){
    12		chomp;
    13		$lista{$_} = ! $lista{$_};
    14	}
    15	close L2;
    16	
    17	print join("\n", grep {$lista{$_}} keys %lista), "\n";
Le righe 1-8 leggono la prima lista e creano un elemento di un'hash
che ha come chiave il nome letto e come valore 1.
Le righe 10-14 leggono la seconda lista e invertono il valore per
ogni chiava trovata.
Ovviamente, se la seconda lista ha nomi che non sono presenti nella
prima, questi saranno aggiunti alla lista finale.
Se non e` questo che vuoi sostituisci la riga 13 con questa:
$lista{$_} = 0;
L'ultima riga e` un po' complessa:
keys %lista            # restituisce le chiavi (i nomi)
grep {$lista{$_}} keys %lista   # seleziona i nomi il cui valore e`
                                # vero (diverso da 0 o '')
join("\n", grep {$lista{$_}} keys %lista)  # unisce i valori con dei "\n"
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E

Caro Marco,
per il tuo problema prova ad aprire la lista che devi sottrarre all'altra
in lettura "<" poi memorizzi tutte le righe in un array, dopo apri la
seconda lista in scrittura ">" e la memorizzi in un altro array, dopo
memorizzi man mano i valori del primo array dentro la variabile predefinita
$_ metti una if che controlli se il valore di $_ è uguale al valore del
secondo array che stai passando, poni $_ uguale a "" e lo scrivi
direttamente dentro al secondo file.
Dovrei farti un esempio ma adesso ti sto scrivendo di fretta, se non riesci
proprio mailami:
mass...@tin.it

Grazie a tutti per l'aiuto prestatomi, problema risolto.
Grazie ancora siete stati monto gentili.
Ciao
TEO
