(gelöst)perl & regex

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
vader
Beiträge: 13
Registriert: 22.03.2005 14:05:13

(gelöst)perl & regex

Beitrag von vader » 30.11.2011 08:47:59

Hallo zusammen,

ich hab ein kleines Problem, es geht um folgendes:
ich schreibe ein Script in Perl (5.10), ich möchte eine src Datei filtern. Da hab ich blöcke die ich durch #ifdef STRING1 #endif und #ifdef STRING2 #endif unterscheiden kann. Jetzt die Frage, wie kann ich mir so ein Block merken?

bis jetzt hab ich so gemacht :

Code: Alles auswählen

if($line =~/\#ifdef/){
if($line =~ /STRING1/){
tue was...
}
}
Könnt ihr mir vielleicht weiterhelfen, Perl mach ich erst seit 2 Tagen.

Danke im Voraus
Gruß
Sebastian
Zuletzt geändert von vader am 30.11.2011 11:55:34, insgesamt 1-mal geändert.

Benutzeravatar
hikaru
Moderator
Beiträge: 13914
Registriert: 09.04.2008 12:48:59

Re: perl & regex

Beitrag von hikaru » 30.11.2011 09:07:37

Du kannst das Pattern oder Teile davon in runde Klammern einschließen. Das Ergebnis des Matchings steht dann als Variable mit Nummer zur Verfügung.
Beispiel:

Code: Alles auswählen

if($line =~/(\#ifdef)/){
  print $1;
}
würde beim Matching das ausgeben:

Code: Alles auswählen

#ifdef
Das klappt natürlich auch mit regulären Ausdrücken und wird erst dann wirklich sinnvoll:

Code: Alles auswählen

if($line =~/(\d{4})/){
  print $1;
}
könnte sowas ausgeben: Falls es nur um das Matching fixer Strings geht und die Laufzeit entscheidend ist solltest du statt eines regex-Matchings lieber auf die index-Funktion zurückgreifen.

vader
Beiträge: 13
Registriert: 22.03.2005 14:05:13

Re: perl & regex

Beitrag von vader » 30.11.2011 09:24:52

Das hab ich bis jetzt gemacht:

Code: Alles auswählen

foreach my $line(@array_of_bean){
                if($line =~/(\#ifdef)/){
                print $1;
                #$line =~ s/^.*\}//p;
                if($line =~ /(\@property)/){
                        $line =~ s/(\@property)//;
                        $line =~ s/^.*\)//;

                        if($line =~ /(\*)/){
                                $line =~ s/(\*)//;
                                push (@new_array_of_bean,$line);
                        } else {
                                push (@new_array_of_bean,$line);
                        }
                        # print "$line";
                } 
             }
       }
tatsächlich bekomme diesen String ausgegeben.

aber wie kann ich ihn sagen fange bitte bei #ifdef an und ende wenn du -endif findest. Ich möchte diesen Block dazwischen bearbeiten. Ich hab z.B. 2 -3 solche Blöcke.

wie gehe ich da vor?

Danke

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: perl & regex

Beitrag von Liffi » 30.11.2011 09:46:36

vader hat geschrieben: aber wie kann ich ihn sagen fange bitte bei #ifdef an und ende wenn du -endif findest. Ich möchte diesen Block dazwischen bearbeiten. Ich hab z.B. 2 -3 solche Blöcke.
Du könntest zum Beispiel aus allen Zeilen einen String bilden (mit '\n'.join(@lines).
Dann kannst du mit

Code: Alles auswählen

for ($s =~ /\#ifdef(.*)\-endif/s )
{
    print $1;
}
das dazwischen extrahieren.

EDIT:: Nicht ausprobiert. Das s als modifier sollte sich aber über newlines "hinwegstrecken".

vader
Beiträge: 13
Registriert: 22.03.2005 14:05:13

Re: perl & regex

Beitrag von vader » 30.11.2011 11:55:03

Vielen Dank für eure Hilfe. ;)

Antworten