42. kasu praktikoa: Indize onomastikoa

     Ikerketa-lan batean gabiltza buru-belarri. Bertan, besteak beste, liburuetako pertsonaiak aztertu behar ditugu: beraien izena, zenbat aldiz agertzen diren liburuan, eta beren aipamenak non agertzen diren. Lana errazteko asmoz, indize onomastikoak egiteko Perl programa bat garatzea bururatu zaigu.

      Hona programaren portaera erakusten duen exekuzio-adibidea:
  >perl indOnomastikoa.pl anabitarteDonostia.txt
  …
  Anita
  61, 67, 248, 747, 766, 1112
  Anton
  106, 118, 127, 129, 129, 130, 132, 146, 151, 158, 60, 214, 220, 242, 251, 453, 517, 677, 714, 716, 718, 1109, 1114, 1115, 1144, 1144, 1156, 1198, 1255
  Antton
  138, 220, 221, 222, 438, 529, 670, 670, 670, 672, 677, 710, 737, 740, 1023, 1111, 1123, 1124, 1124, 1125, 1135, 1135, 1135, 1141, 1142, 1142, 1142, 1143, 1145, 1145, 1146, 1174, 1200, 1200, 1210, 1256
  …
  >
      Pertsonaia bakoitzaren agerpenak kontatzeko, egokiena hash egitura erabiltzea dela erabaki dugu: gakoak izen bereziak izango dira, eta balioak, berriz, izen horiek agertzen diren lerro-zenbakiak. Izen berbera behin baino gehiagotan ager liteke testuan, eta gure egiturak agerpen guztiak gorde behar ditu bata bestearen atzetik. Komeni zaigu agerpen guztiak array batean gordetzea, ondoren kontsultatu, ordenatu, kontatu, etab. nahi badugu ere. Erreferentzia erabiliz egin dezakegu hori: hash egituraren gako gisa, izen bereziak erabiliko ditugu, eta balio gisa, berriz, array baterako erreferentzia. Erreferentziatutako array-ak izen bereziaren agerpen guztien zerrenda gordeko du.
      Baina programak badauka beste koska bat ere: nola bereizi izen bereziak gainerakoetatik? Bai, izen bereziak aurretik puntuazio-markarik izan ez eta letra larriz hasten diren hitzak dira. Ados, irizpide hori erabiliko dugu, nahiz erabat zu zena izan ez; esaldi-hasierako hitz bereziak baztertu egingo ditugu gure hurbilpe narekin. Adib.: «Jonek ez zuen aurpegi onik jarri». Horrez gain, arazo praktiko bat ere planteatzen du, fitxategiak lerroz lerro prozesatu ohi ditugunez, lerroko lehen hitza letra larriz hasten bada, nola jakin hitz berezia den ala ez? Aurreko lerroko azken karakterea puntuazio-marka den ala ez begiratu beharko genuke, eta horrelakorik ez dugu orain artean egin.
      Hona gure proposamena: aldagai berezi bat erabiliko dugu, $puntAurretik, letra larriz hasten den hitz batekin topo egiten dugunean, bere aurretik puntuazio-markarik izan den ala ez jakiteko. Hau da, puntuazio-marka aurkitzen dugun aldiro $puntAurretik aldagaiari bat balioa esleituko diogu, ondoren etorriko den hitza letra larriz hasi arren, ez dela hitz berezia jakin dezagun.

    Gure ideia Perl lengoaiara itzulita:

indOnomastikoa.pl Perl programaren kodea

 #!/usr/bin/perl
 use warnings;
 use strict;
 open(FITX, $ARGV[0]) or
      die(“Ezin $ARGV[0] fitxategia zabaldu!n”);
 my $lerro;
 my %indizea;
 my $puntAurretik = 1;
 my @agerpen;
 while ($lerro = <FITX>) {
      while ($lerro =~ /([A-Z]w+|[.?!])/g){
             # bat egitea larriz hasitako hitzak?
             If ($1 =~ /([A-Z]w+)/) {
                  if ($puntAurretik == 0) {
                        # %indizea hash-ean $1 gakoa existitzen ez
                        # bada, sortu gako horrentzako
                        # izengabeko array baten erref.
                        $indizea{$1} = []
                               if (!exists($indizea{$1}));
                        # Gehitu lerro zenbakia
                        # erreferentziatutako array-aren amaieran
                        push(@{$indizea{$1}}, $.);
                        # $. —>uneko lerro zenbakia
                  }
                  $puntAurretik = 0;
             }
             else { # bat egitea puntuazio-ikurrak
                  $puntAurretik = 1;
             }
      }
 }
 close(FITX);
Kasu praktikoak                                             247
 # %indizea egiturako gakoak ordenatuta lortu
 # eta begizta bidez banan-banan pantailaratu
 foreach my $izen (sort(keys(%indizea))) {
        print(“$izenn”);
        # $izen pertsonaiaren array-a atzitu eta @agerpen
        # array-an gorde
        @agerpen = @{$indizea{$izen}};
        # @agerpen string-ean bildu eta pantailan bistaratu
        print(join(“, “, @agerpen));
        print(“n”);
 }

Jaitsi   indOnomastiko.pl   fitxategia

Utzi erantzuna

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