Newsgroup: it.comp.lang.perl
Titolo: insiemistica e files

problema: ho due files con elenchi di parole (una parola per riga)
voglio creare un file che di questi elenchi ne faccia (a scelta)
l'unione, l'intersezione e la sottrazione
 finora l'unica idea e' di usare %array, visto che le chiavi non si
possono ripetere.
Domanda: esistono in perl modi piu' eleganti (e magari migliori) ?
ecco i miei workaround (NB activstate perl 5.? , WinNT)
Gia' che ci sono: come si fa a chiedere a perl la sua versione? (io l'ho
scaricata qualche giorno fa)
LE MIE BRUTTE SOLUZIONI
=======================
&sottrazione( 'A.txt' , 'B.txt' , 'A_senza_B.txt' );
&unione(      'A.txt' , 'B.txt' , 'A_or_B.txt'    );
&intersezione('A.txt' , 'B.txt' , 'A_and_B.txt'   );
sub sottrazione {local(%set,$x);
    open(IN0,$_[0]) or die "Impossibile leggere il file $_[0]\n";
@in0=<IN0>; close(IN0);
    open(IN1,$_[1]) or die "Impossibile leggere il file $_[1]\n";
@in1=<IN1>; close(IN1);
    foreach $x (@in0) {$set{$x}=1};
    foreach $x (@in1) {delete $set{$x}};
    open(OUT,">$_[2]") or die "Impossibile scrivere il file $_[2]\n";
    foreach $x (keys(%set)) {print OUT $x};
    close(OUT);
    };
sub intersezione {
    open(IN0,$_[0]) or die "Impossibile leggere il file $_[0]\n";
@in0=<IN0>; close(IN0);
    open(IN1,$_[1]) or die "Impossibile leggere il file $_[1]\n";
@in1=<IN1>; close(IN1);
    foreach $x (@in0) {$set{$x}++};
    foreach $x (@in1) {$set{$x}++};
    open(OUT,">$_[2]") or die "Impossibile scrivere il file $_[2]\n";
    foreach $x (keys(%set)) {print OUT $x if $set{$x}==2};
    close(OUT);
    };
sub unione {local(%set,$x);
    open(IN0,$_[0]) or die "Impossibile leggere il file $_[0]\n";
@in0=<IN0>; close(IN0);
    open(IN1,$_[1]) or die "Impossibile leggere il file $_[1]\n";
@in1=<IN1>; close(IN1);
    foreach $x (@in0) {$set{$x}=1};
    foreach $x (@in1) {$set{$x}=+2};
    open(OUT,">$_[2]") or die "Impossibile scrivere il file $_[2]\n";
    foreach $x (keys(%set)) {print OUT $x};
    close(OUT);
    };

...


 &intersezione('A.txt' , 'B.txt' , 'A_and_B.txt'   );
Se le tue soluzioni funzionano (come credo) non le considerei brutte...
Le mie invece sono... non so come definirle...
ma mi andava di giocherellare col perl...
#!/usr/bin/perl
my @file1;
my @file2;
my @outfile;
open(FILE1,"file1.txt") or die "cazzarola, non riesco ad aprire
'file1.txt'";
@file1 = <FILE1>;
close(FILE1);
open(FILE2,"file2.txt") or die "ed ora non riesco ad aprire 'file2.txt'";
@file2 = <FILE2>;
close(FILE2);
@outFile = &unione(@file1, @file2);                # per l'unione
@outFile = &sottrazione(\@file1, \@file2);        # per la sottrazione
@outFile = &intersezione(\@file1, \@file2);        # per la sottrazione
open(OUT,">outfile.txt") or die "ecche e'? non posso scrivere
'outfile.txt'";
foreach (@outFile) {
    print $_;
}
#
# ritorna una lista composta da univoci elementi presenti in entrambe le
liste
sub unione {
    my @unione = @_;
    return sort keys %{ { map { $_, 1 } @unione } }
}
#
# ritorna una lista composta solo dagli elementi della prima lista lista che
non
#    sono presenti nella seconda (A-B)
sub sottrazione {
    my ($arr1,$arr2) = @_;
    %first = %{ { map { $_, 1 } @$arr2 } };
    return grep { !($first{$_}) } @$arr1;
}
#
# ritorna una lista composta solo dagli elementi che sono presenti sia nella
#    prima che nella seconda lista
sub intersezione {
    my ($arr1,$arr2) = @_;
    %first = %{ { map { $_, 1 } @$arr2 } };
    return grep { ($first{$_}) } @$arr1;
}
# end of this source
--
Alex Garbagnati, 
agarb...@removethis.decisive.com
Sr. Lead Engineer, Product Development
Decisive Technology Corporation
Mountain View, CA  94043

Mi sono dimenticato di togliere il 'sort' dalla sub che gestisce
l'unione... a me serve perche' uso questo comando per deduplicare
informazioni e, conseguentemente avere una lista 'ordinata' da sbattere a
video, ma in questo caso se avere i dati ordinati non e' richiesto e'
meglio...
ogni nanosecondo risparmiato e' un nanosecondo guadagnato...
sub unione {
    my @unione = @_;
    return keys %{ { map { $_, 1 } @unione } }
}
	Best regards,
		Kazuma
