2016-11-19 1 views
0

Ich habe Dateien, die Header-Format hat beginnt mit> Zeichen. Sagen wir, wenn die Kopfzeile dieses Format hat: '> anything1 | any2', benutze ich dieses Skript, um Header zu trimmen und Ausgabe-Header '> anything1' zu erhalten.Was ändert sich in der Schleife, um die Ausgabe zu erhalten?

while (<>) { 
    if (/^(>[^|]*)/) { 
    print "$1\n"; 
    } else { 
    print; 
    } 
} 

Aber jetzt, in meinen Dateien sind einige Header wie diese groß:

>anything1|anything2|anything3 bla bla bla /# 

und einige Header sind wie:

>anything1 

nun aus diesem gemischten Header-Typ in einer einzigen Datei , wenn ich eine Ausgabe wünsche, die Kopfzeilen bis zu 2 Zeichen für größere Kopfzeilen (das heißt '> anything1 | anything2' für die obige große Kopfzeile) abschneidet und ein Zeichen für die kleinen Kopfzeilen behält (dh '> anything1' nur für die über sm alle Header), welche Änderungen muss ich in meiner Schleife machen?

Dank

Antwort

1

Wie wäre es

while (<>) 
{ 
    if (/^>/) 
    { 
     my @fields = split '\|', $_; 

     if (@fields <= 2) { print $fields[0] } 
     else    { print join '|', @fields[0,1] } 

     next; 
    } 

    print; 
} 

Bitte beachten Sie mögliche Grenzfälle aus dieser regex bekommen. Es ist einfach, wenn Sie ein Array haben.

Mit Regex kann man die Fälle einzeln abgleichen, oder man kann sich sorgfältig einen ausdenken, der diese zwei oder drei verschiedenen Szenarien bündelt, was sehr viel komplizierter ist.

+0

Ich weiß nicht, ob ich etwas falsch mache, aber ich führe dein Skript als: perl script.pl Eingabedatei> Ausgabedatei, und es zeigt: Syntaxfehler bei 1.pl Zeile 8, in der Nähe von "sagen Join" Die Ausführung von 1.pl wegen Kompilierungsfehlern abgebrochen –

+1

@ J.Carter Ich vermutete, dass es mehr in Ihrem Skript gibt. Außerdem war ich schlampig mit diesem 'say' - es braucht' verwenden Sie die Funktion qw (say); '. Ich habe es durch 'print' ersetzt. – zdim

+0

Es beunruhigt mich, dass Stack Overflow eine Code-Fabrik für Leute geworden ist, die ihr eigenes Frühstück nicht debuggen konnten. – Borodin

Verwandte Themen