40. kasu praktikoa: kopia-detektatzailea

     Kopiak detektatzen dituen programa garatuko dugu oraingo honetan. Aurreko ariketan bezala, sarrera gisa 2 fitxategi jaso eta haien edukia konparatuko du programak. Baina oraingoak ez du konparaketa lerroz lerro gauzatuko. Iruditzen zaigu kopiak detektatzeko fitxategien edukia lerroz lerro edo hitzez hitz konparatzea baino egokiagoa litzatekeela esaldiz esaldi konparatzea. Beraz, konparaziorako elementu gisa esaldia erabiliko dugu.
      Programak bi fitxategi jasoko ditu komando-lerrotik, eta irteeran alfabetikoki ordenatutako esaldi-zerrenda itzuliko du honako sinboloekin batera:
• A: esaldia lehen fitxategian bakarrik agertu da.
• B: esaldia bigarren fitxategian bakarrik agertu da.
• AB: esaldia bi fitxategietan agertu da.

      Adibide gisa, eta programaren funtzionamendua hobeto uler dadin, bi fitxategi hauen edukia konparatuko dugu:

fitx1.txt
 Azkeneko gerratea bukatu zan. Txomin donostiarra Ernani-ko aldapan gora zaldi-gañean zetorren. An, atzean, gelditu zan Ernani ta Ernani-ko kartzela, Txomin ain luzaroan
 egondakoa. Pakearekin askatasuna eman zioten eta Txomin eta zaldia alkarrekin ixilik zetozen.

fitx2.txt

 An, atzean, gelditu zan Ernani ta Ernani-ko kartzela, Txomin ain luzaroan egondakoa. Pakearekin askatasuna eman zioten eta Txomin eta zaldia alkarrekin ixilik zetozen.
 Zaldiak eup egin zuan; nekez bazan ere, aldapa gaitza menderatu zuan. Zaldunak eta zaldiak atseden artu.
    
 Testu beraren bi puska dira, eta bi esaldi berdin dituzte. Ea zer dioen gure programak:

 >perl kopiaDetekt.pl fitx1.txt fitx2.txt
 *****************
 An, atzean, gelditu zan Ernani ta Ernani-ko kartzela,  Txomin ain luzaroan egondakoa                     AB
 Azkeneko gerratea bukatu zan                  A
 Pakearekin askatasuna eman zioten eta Txomin eta zaldia alkarrekin ixilik zetozen                 AB
 Txomin donostiarra Ernani-ko aldapan gora zaldi- gañean zetorren       A
 Zaldiak eup egin zuan; nekez ba-zan ere, aldapa gaitza menderatu zuan B
 Zaldunak  eta zaldiak atseden artu. B
 *****************
 >

 Gure proposamenak hiru hash egitura erabiltzen ditu: fitxategi bakoitzeko esaldiak gordetzeko bi, eta hirugarrena,berriz, esaldi guztiak gordeko dituena:
• %hash1: lehen fitxategiko esaldiak gordetzeko.
• %hash2: bigarren fitxategiko esaldiak gordetzeko.
• %hashOrok: esaldi guztiak, lehen eta bigarren fitxategikoak.
     Programaren prozedura orokorra honakoa izango da: lehenbizi sarrerako fitxategiak zabaldu, esalditan banatu eta gorde hauek dagozkien hash-etan. Fitxategia zabaldu eta esalditan banatzeko esalditanBanatu() azpiprograma erabiliko dugu. Azpiprograma horrek argumentu bezala fitxategi-izena jaso, eta bere edukia
esalditan banatu ondoren, array gisa itzuliko du alfabetikoki ordenatuta.
     Fitxategietako edukia esalditan banatu eta hash egituretan gorde ostean,
esaldi guzti-guztiak biltzen dituen %hashOrok egiturako elementuak (esaldiak)
banan-banan hartu eta honela etiketatuko ditugu:
• Esaldia %hash1-en badago? Baiezkoan jarri A etiketa.
• Esaldia %hash2-n badago? Baiezkoan jarri B etiketa.
     Esaldia bi testuetan agertzen bada, AB etiketa eramango du, eta bestela, dagokion testuarena.

Hona programa bera:

kopiaDetekt.pl
 #!/usr/local/bin/perl
 use warnings;
 use strict;
 my (%hash1, %hash2, %hashOrok, @esaldiak1, @esaldiak2);
 # lehen fitxategia esalditan banatu
 @esaldiak1 = esalditanBanatu($ARGV[0]);
 # Esaldi bakoitza prozesatu
 foreach my $esaldi (@esaldiak1) {
        # Lehen fitxategiko esaldiak biltzen dituen hash-a
        $hash1{$esaldi} = 1;
        # Esaldi guztiak biltzen dituen hash-a
        $hashOrok{$esaldi} = 1;
 }
 # bigarren fitxategia esalditan banatu
 @esaldiak2 = esalditanBanatu($ARGV[1]);
 # Esaldi bakoitza prozesatu
 foreach my $esaldi (@esaldiak2) {
        # Bigarren fitxategiko esaldiak biltzen dituen hash-a
        $hash2{$esaldi} = 1;
        # Esaldi guztiak biltzen dituen hash-a
        $hashOrok{$esaldi} = 1;
 }
 # Esaldi guztiak alfabetikoki ordenatu
 # banan-banan tratatzeko
 print (“*****************n”);
 foreach my $elem (sort(keys(%hashOrok))) {
        print (“$elemt”);
        # $elem agertu da lehen lerroan?
        if(exists($hash1{$elem})) {
                 print(“A”);
        }
        # $elem agertu da bigarren lerroan?
        if(exists($hash2{$elem})) {
                 print(“B”);
        }
        print (“nn”);
 }
 print (“*****************n”);
 sub esalditanBanatu {
        my $fitxIzen = shift(); # argumentua: fitxategi-izena
        open(FITX, $fitxIzen) ||
                die(“Ezin $fitxIzen fitxategia zabaldun”);
        my $testua = “”;
        my $lerro;
        while ($lerro = <FITX>) {
                 # Ordezkatu lerro jauziak zuriuneengatik
                 $lerro =~s/n$/ /g;
                 # Kateatu lerroa $testua aldagaiari
                 $testua.= $lerro;
        }

    close(FITX);
    # $testua string-a esalditan banatu
    my @esaldiak = split(/[.?!]+s+/, $testua);
    return @esaldiak;
 }

Jaitsi   kopiaDetekt.pl   fitxategia

Utzi erantzuna

Zure e-posta helbidea ez da argitaratuko. Beharrezko eremuak * markatuta daude