Newsgroup: it.comp.lang.perl
Titolo: dividere testo

dividere testo
ho una pagina .html cosi strutturata:
[code]
<html>
 ...
  <!-- #NEWS# -->
  <!-- #ENDNEWS# -->
 ...
</html>
[/code]
Avrei bisogno di mettere in @primo tutto il contenuto dall'inizio pagina 
fina alla riga che include il tag <!-- #NEWS# -->
Avrei poi bisogno di mettere in @secondo tutto il contenuto dalla riga 
che include il tag <!-- #ENDNEWS# --> fino alla fine del documento
Il metodo che uso tuttora è troppo antico e non sempre funge...magari 
voi potete consigliarmi qualche RE che fa al caso mio!?
Grazie mille!!

voi potete consigliarmi qualche RE che fa al caso mio!?
Senza sapere qual è il metodo "antico", è difficile suggerirne uno "nuovo"
e capire perché l'antico talvolta fallisce.
Per come la descrivi, l'operazione sembra comunque molto semplice, e non si
vede perché un approccio altrettanto semplice non debba funzionare:
    while (<DATA>) {
        push @primo, $_;
        last if (/^\s*<!-- #NEWS# -->\s*$/);
    }
    while (<DATA>) {
        last if (/^\s*<!-- #ENDNEWS# -->\s*$/);
    }
    push @secondo, $_;
    while (<DATA>) {
        push @secondo, $_;
    }
 
    #---
    print "PRIMO\n";
    for my $uno (@primo) {
        print $uno;
    }
    print "SECONDO\n";
    for my $uno (@secondo) {
        print $uno;
    }
    __END__
    <html>
     primo 1
     primo 2
      <!-- #NEWS# -->
     salta 1
     salta 2
      <!-- #ENDNEWS# -->
     secondo 1
     secondo 2
    </html>
Sempre, naturalmente, che si possa fare affidamento sul fatto che i
commenti di separazione si presentino sempre da soli e per intero su una
riga.
Naturalmente, si può fare in altri modi, e può darsi che questo fallisca se
si verificano altre condizioni che non ci hai detto. Prima di suggerire
altre soluzioni, comunque, bisognerebbe saperne di più.
Ciao.

 
secondo te quanto può essere affidabile questa RE?
$html =~ /(.+?\#NEWS\#\s*?\-\-\> ).*?(\<\!\-\-\s*?\#ENDNEWS\#.+)/s;
$primo = $1;
$secondo = $2;

$secondo = $2;
($primo, $secondo) = ($html =~ /(
                                  (?:.|\n)+
                                   ^\s*<!--\s*\#NEWS\#\s*-->\s*$
                                )
                                (?:.|\n)*
                                (
                                  ^\s*<!--\s*\#ENDNEWS\#\s*-->\s*$
                                  (?:.|\n)*
                                )
                               /mx);
Credo che, insistendo sulla richiesta che i commenti siano in righe
separate, potrebbe dare meno falsi positivi. Per intendersi, la tua
espressione cattura questo:
     <html>
     primo 1
     primo 2
     <!-- #NEWS# -->  
     salta 1
     salta 2 <!-- #ENDNEWS# -->
     secondo 1
     secondo 2
    </html>
quella sopra no. Naturalmente, può darsi benissimo che tu appunto voglia
catturarlo, questo però ti espone maggiormente a possibili errori,
nell'improbabile (ma non impossibile) caso che uno dei due commenti venga
"citato" in una stringa.
(E ritorniamo al solito discorso, che per trattare correttamente un
documento html si finisce per dover costruire un parser html completo.)
Mi chiedo poi anche perché ci si debba rompere la testa per costruire
un'unica espressione regolare che faccia tutto, e non si possa svolgere il
compito in più passi, ma anche qui nulla di nuovo.
Con qualche certezza in più sulle stringhe di separazione, si potrebbe
anche fare:
    $/ = "<!-- #NEWS# -->";
    $primo = <DATA>;
    $/ = "<!-- #ENDNEWS# -->";
    $_ = <DATA>;
    $/ = undef;
    $secondo = "<!-- #ENDNEWS# -->" . <DATA>;
 
    print "PRIMO\n";
    print $primo, "\n\n";
    print "SECONDO\n";
    print $secondo, "\n";
    __END__
    <html>
     primo 1
     primo 2
     <!-- #NEWS# -->
     salta 1
     salta 2
     <!-- #ENDNEWS# -->
     secondo 1
     secondo 2
    </html>
 
E ancora mi pare di non aver detto nulla di nuovo.
Ciao.