xNeTworKx: Warum funktioniert über mehrere Zeilen suchen nicht ?

Hallo,
ich hab das Problem, daß ich einen Suchausdruck über mehrere Zeilen anwenden will, zB ich will alles einlesen was zwischen <text> und </text> steht. Es funktioniert aber nicht, er findet einfach nix.
Ich lese das ganze File als Skalarwert ein ,aber er findet trotzdem nichts.

So lese ich ein:

#!C:/Perl/bin/Perl.exe -w

use strict;
my $in;
print "Content-type:text/html\n\n";
open(FILE,"1012512977.txt") or die "cant open File : $!\n";

while (<FILE>)   {
 $in .= $_
 }
print $in;

Wenn ich jetzt aber:
if ($in =~ /<text>(.*)</text>/)  {
$inhalt = $1;
}
print $inhalt;

drauf anwende, passiert gar nichts. Er findet nichts.

So sieht mein Probefile aus:

<top><topic>Network test</topic><name>network</name><email>----</email><hpadresse>----</hpadresse><text>ftrhzdtrhzu dtrhdr
<br>
<br>drz drz drz
<br>
<br>srz b zdtrzu dtu r
<br>
<br>
<br>
<br> duzdrz drz dr zdrz dr zdrz crz dtrz h
<br>
<br>
<br>bui zbvtzu</text></top>

P.S Wenn ich den ganzen Inhalt ausgeben lasse, macht er mir zwischen jedes <br> noch eine Leerzeile, was wahrscheinlich die Ursache dafür ist, daß er nichts findet, aber wie kann ich das umgehen ?

  1. Hallo nochmal,
    ich habe jetzt eine vorübergehende, nicht so elegante Lösung:
    #!C:/Perl/bin/Perl.exe -w

    use strict;
    my $in;
    my $inhalt;
    print "Content-type:text/html\n\n";
    open(FILE,"1012512977.txt") or die "cant open File : $!\n";

    while (<FILE>)   {
     $in .= $_
     }
    $in =~ s/<br>/<umbruch>/g;
    $in =~ s/\n//g;
    if ($in =~ /<text>(.*)</text>/)  {
    $inhalt = $1;
    $inhalt =~ s/<umbruch>/<br>/g;
    }
    print $inhalt;

    Weis einer vielleicht noch eine bessere Lösung ?

    1. Hallo Unaussprechlicher ;-)

      . findet normalerweise keine Zeilenumbrüche.
      Das kannst Du aber erzwingen:

      /.*/s #jetzt werden auch Zeilenumbrüche gefunden.

      Grüße

      Daniel

      1. Hallo,
        ich habs jetzt überhaupt so gemacht :

        while (<FILE>)   {
         chomp;
         $in .= $_
         }

        Die Perl Zeilenumbrüche kann ich ruhig wegschneiden, da \n mit <br> sowieso beim speichern ersetzt wird, und ich somit nicht nochmal Zeilenumbrüche brauch. Das is auch das einzige was mit verwundert, woher eigentlich die die 2. Zeilenumbrüche kommen. Also statt
        <br>egte drtdr
        <br>dghdfghdr trhz
        <br>g eg drhtrhdtrhdf

        würde
        <br>mhuuiz8zhu

        <br> iuuiziuzhu

        <br> iuio zuuizh

        stehen.
        Aber egal, Problem gelöst.

  2. Hallo,
    ich hab das Problem, daß ich einen Suchausdruck über mehrere Zeilen anwenden will, zB ich will alles einlesen was zwischen <text> und </text> steht.

    So lese ich ein:

    #!C:/Perl/bin/Perl.exe -w

    use strict;
    my $in;

    $/ = ''; # siehe perldoc perlvar: hier steht der Trenner zwischen den einzelnen "Zeilen" (jetzt nur noch eine Zeile)

    print "Content-type:text/html\n\n";
    open(FILE,"1012512977.txt") or die "cant open File : $!\n";

    $in = <FILE>;

    print $in;

    close(FILE);

    Wenn ich jetzt aber:
    if ($in =~ /<text>(.*)</text>/)  {

    if ($in =~ /<text>(.*?)</text>/g)  {
       # 1. das ? hinter dem *: Damit wird der * auf faul gestellt. Nimm
       # folgende Situation:

    <text>ösjlölkdsj</text><text>hhh</text>

    # dann findet dein regex ösjlölkdsj</text><text>hhh
       # meiner findet nur ösjlölkdsj
       # 2. das 'g' ganz am Ende:
       # befiehlt deinem regex global zu suchen

    $inhalt = $1;
    }
    print $inhalt;

    Tschö Matti