perl : geht es auch einfacher ?

N

Nano

Foren As
Hi ich habe folgende Aufgabenstellung und bin der meinung das ich sie wohl zu kompliziert gelöst habe, gibt es da einen einfacheren / saubereren weg ?

Folgende Aufgabenstellung :

Eine Datei enthält einen Text mit Kommentaren die durch stringAnfang und string Ende gekennzeichnet sind. Alle Kommentare sollen ausgegeben werden.


hierfür habe ich den Text in ein array eingelesen und dann folgendes veranstaltet :

Code:
  #komplette Datei aus dem Array in einen string schreiben, ohne \n

        my $arraystring = "";
        foreach my $x (@array){
                chomp($x);
                $arraystring = $arraystring.$x;
        }

        #kompletten string nach $stringAnfang.*$stringEnde ( kleinste folge ) absuchen, das Ergebnis in $1 speichern und den rest in $2

        while( $arraystring =~ m#$stringAnfang(.*?)$stringEnde(.*)# ){
                print "$1 \n";
                $arraystring = $2;
        }


es funktioniert, allerdings bin ich mit dem Lösungsweg nicht wircklich zufrieden
 
hm, ich hab das mal eben für c-style comments (/* bla */) gemacht. wobei damit das auch zeilenübergreifend funktioniert (trotz zeilenweisem einlesen der daten) hab ich mir da einen "longString" zusammengeschustert, der nach einem match immer wieder resettet wird. irgendwie auch noch nicht der gipfel der eleganz :s

PHP:
#!/usr/bin/env perl

my $strStart = '/\*';
my $strEnd = '\*/';

my $longStr;

while(<>)
{
    $longStr .= $_;
    if ($longStr =~ m/$strStart(.+?)$strEnd/s) 
    {
        print "$1\n";
        $longStr = '';
    }
}




[edit]:
gibt es da einen einfacheren / saubereren weg?
eine sache noch, statt:
PHP:
my $arraystring = "";
        foreach my $x (@array){
                chomp($x);
                $arraystring = $arraystring.$x;
        }
geht einfach:
PHP:
my $arraystring = join('', @array);

siehe dazu auch -> klick mich <-
wobei dann natürlich die newlines-chars ("\n") erhalten bleiben. wenn du einen string über mehrere zeilen matchen willst, kannst du bei den match-optionen 's' für 'singleline' angeben. dann matcht der punkt auch newlines.
respektive wenn du einfach die zeilenumbrüche loswerden willst, geht das ja auch ziemlich einfach:
PHP:
$arraystring =~ s#\n##g;
 
Zuletzt bearbeitet:
Guter Ansatz, aber nicht 100%ig vollstaendig, da C ja auch noch // Kommentare erlaubt. Ich denke die Aufgabe muss genauer geschildert werden.

Ansonsten kennt Perls Regex Engine noch die "m" Option, welche Newlines ignoriert.
 
Guter Ansatz, aber nicht 100%ig vollstaendig, da C ja auch noch // Kommentare erlaubt. Ich denke die Aufgabe muss genauer geschildert werden.

Wenn man aber von der Aufgabenstellung, wie sie oben steht, ausgeht, dann gibt es keinen Hinweis auf C. Da steht nur "stringAnfang" und "stringEnde".
 
Guter Ansatz, aber nicht 100%ig vollstaendig, da C ja auch noch // Kommentare erlaubt. Ich denke die Aufgabe muss genauer geschildert werden.
naja, die einzigen kommentare die ich kenne, die so etwas wie einen "start" und "end" string haben, sind halt diese /* fn0rd */ kommentare. und das newline zeichen bei den "//" kommentaren würde ich nicht als string bezeichnen. (kann man natürlich und man würde nicht falsch damit liegen..)
deswegen hab ichs halt nur für diese kommentare gemacht.

und soweit ich weiß beeinflusst das "m" flag nur das verhalten von den "^" und "$" anchors. die matchen dann nämlich statt nur am anfang und am ende des strings am anfang und ende jeder zeile des strings. wenn man mit "m" noch anfang und ende des strings mitmatchen will muss man "\A" und "\Z" benutzen. (beziehungsweise "\Z" matcht auch vor newlines. will man wirklich nur das ende matchen nimmt man "\z".)
 

Ähnliche Themen

[Perl] Perl OO Methodenaufruf in anderem Objekt

[PERL] Mit Regex kompletten String durchsuchen und ersetzen

CMS Problem [php]

Zurück
Oben