#!/usr/bin/perl # [c] piotao, 20070320, perl 5.8+ # http://piotao.math.univ.gda.pl/Perl/ # Program do mnozenia plikow. Mnozy tak, jak mnozy sie zbiory: # plik1 * plik2 = to co jest wspolne dla obu plikow # Nalezy podac dwa argumenty. use strict; use warnings; # pierwszy argument umieszczamy w zmiennej $file1 (musi to byc plik) my $file1 = shift @ARGV || die "Podaj nazwe pliku!\n"; # drugi argument umieszczamy w zmiennej (moze to byc nazwa pliku lub nic, wtedy ustawione zostanie '-', # co oznacza standardowe wejscie, STDIN) my $file2 = shift @ARGV || '-'; # wczytujemy caly pierwszy plik do pamieci korzystajac z tego, ze polecenie open zwraca wartosc # powodzenia operacji, robimy z niego takze hasz, aby ustalic co bylo wspolne z drugim plikiem my @file1 = (open F,"<$file1") ? : die "Nie moge otworzyc pliku '$file1'! $!\n"; my %file1 = map{ ($_=>1) } @file1; # tak samo wczytujemy drugi plik, do tablicy, a potem robimy z niej takze hasz my @file2 = (open F,"<$file2") ? : die "Nie moge otworzyc pliku '$file2'! $!\n"; my %file2 = map{ ($_=>1) } @file2; # wypisujemy wiersze z obu plikow tylko wtedy, jezeli znajduja sie one w kazdym z plikow. # zachowana jest kolejnosc i liczba wierszy, oczywiscie. # Tego typu dzialanie wypisze POWTORZENIA wierszy, poniewaz z kazdego pliku pojawia sie # one dlatego, ze byly w kazdym z plikow. foreach(@file1,@file2){ print if exists $file1{$_} and exists $file2{$_}; } # redukcja powtorzen jest prosta - nalezy zapamietac fakt, ze dany wiersz juz wypisano. #my %powtorzenia = (); #foreach(@file1,@file2){ # print if !exists $powtorzenia{$_} and exists $file1{$_} and exists $file2{$_}; # $powtorzenia{$_}++; #} __END__