Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    9

    [Pattern matching]Salvare ciò che si trova tra 2 corrispondenze

    Salve a tutti,

    ho un grande problema che qui vi espongo:
    ho bisogno di salvare in un file (o cmq mostrare a video) il contenuto di ciò che si trova dopo una certa corrispondenza. Mi spiego.
    Problema pratico:
    Devo catalogare alcuni articoli di una legge salvata in un file formato html. Per questo motivo apro il file html e metto il suo contenuto in una stringa (@). In questo modo riesco a trovare la corrispondenza all'articolo (ad es. "art.1") ma come posso salvare ciò che viene dopo "art.1" e prima di "art.2", visto che il contenuto dell'art. 1 non è sulla stessa riga della corssipondenza?
    Con questa routine non si può ottenere niente di utile:

    open (FILE, "legge.html")||die "$!";
    @legge=<FILE>;
    close (FILE);

    foreach $riga(@legge){
    if ($riga =~ m/Articolo.\d/g){
    print "$&";
    }
    }
    In questo caso visualizzo la corrispondenza ma come faccio a salvare il contenuto dell'articolo che si trova sulle righe successive del file?
    Grazie,
    zeno78

  2. #2
    se non c'è un'esigenza particolare non conviene mai mettere il contenuto di un file in un array, in quanto hai un grande spreco di memoria.

    Per le tue esigenze dovrebbe andare bene:

    codice:
    # questo è il criterio di ricerca
    $match = "(Art\.1)|(Art\.5)|(Art\.10)";
    # setti una variabile di controllo
    $ver = 0;
    
    open (FILE, "<legge.html")||die "$!"; 
    # leggi il file riga per riga
    # senza caricarlo in memoria
    while (<FILE>) {
       # se trovi una riga che corrisponde all'inizio
       # di un articolo che ti interessa estrai il numero,
       # setti la variabile di verifica ad 1 e stabilisci
       # il numero dell'articolo successivo a cui cessa
       # la memorizzazione
       if (/$match/) {
          $art = $+;
          $art =~ s/Art\.//;
          $ver = 1;
          $art_succ = $art + 1;
       }
       # quando incontri l'articolo successivo
       # setti la verifica a 0
       if (/Art\.$art_succ/) {
          $ver = 0;
       }
       # se la verifica è 1 memorizzi le righe in un hash 
       # di array, con questa struttura
       # %arts = (
       #           1 => [righe articolo 1],
       #           5 => [righe articolo 5],
       #          10 => [righe articolo 10]
       #         );
       if ($ver == 1) {
          push(@{$arts{$art}}, $_);
       }
    }
    close (FILE);
    
    # poi lo stampi così:
    
    foreach $art (sort{$a <=> $b} keys %arts) {
       foreach $riga (@{$art}) {
          print $riga;
       }
    }
    il codice sopra non è testato, quindi potrebbe contenere errori, e poi lo devi personalizzare, ma serve a darti un'idea di un algoritmo possibile.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    9
    Innanzitutto ringrazio shishii per l'aiuto che è sempre disposto a dare a tutti.
    Seguirò il tuo consiglio e tenterò la strada che mi hai suggerito sperando di venire qui a portare nuove buone notizie!
    Grazie ancora,
    zeno78

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    9
    Salve,

    ho personalizzato lo script suggerito da shishii e devo dire che funziona. L'unica parte che non mi riesce di far andare è la memorizzazione nell'hash anonimo. Ho provato a verificare se le varie variabili si riempivano di contenuti e il responso è stato affermativo; al contrario l'hash non sembra popolarsi... ci sto lavorando su.. cmq spettacolare il riuscire a memorizzare il contenuto degli artt.!
    Mitico shishii!

    Ciao,
    zeno78

  5. #5
    ho fatto un errore qui:

    foreach $art (sort{$a <=> $b} keys %arts) {
    foreach $riga (@{$art}) {
    print $riga;
    }
    }

    deve essere:

    codice:
    foreach $art (sort{$a <=> $b} keys %arts) {
       foreach $riga (@{$arts{$art}}) {
          print $riga;
       }
    }
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    9
    Mitico!
    Funziona alla grande! Adesso sto provvedendo a modificare lo script in modo da renderlo funzionante per ciò che mi serve... non posso far altro che ringraziarti di cuore.
    Ciao shishii.
    zeno78

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.