[perl] Doppelbuchstaben

buli

buli

Debianator
Moin!
Ich moechte gerne aus einerTextdatei alle Doppelbuchstaben raussuchen, in Klammern fassen, und anschliessend nur die Zeilen mit den Doppelbuchstaben ausgeben.
Geht auch soweit:

Code:
#!/usr/bin/perl -w

$pfad="~/geschichte.txt";


open(DATEI, "<$pfad") || die "Datei nicht gefunden!\n";


while ($line = <DATEI>) {

if ($line =~ s/aa|bb|dd|ee|ff|gg|hh|ii|jj|kk|ll|mm|nn|oo|pp|rr|ss|tt|uu|zz/($&)/g) {
$line =~ /(..)/;
print "$line";
   }
}

 close(DATEI);

Ich finde aber, der Suchstring ist dummes Zeug. Das muss doch einfacher gehen!

Code:
s/[a-z]{2}/($&)/g
Bringt mir zwar zwei aufeinander folgende Buchstaben, aber keine doppelten.

Ich sitze schon die ganze Nacht davor, und hab grad ne Blockade.
 
Code:
s/([a-z])\1/($1)/g
Kann mir ma jemand sagen, wieso ich noch im matchen nich mit $1 sondern nur mit \1 dereferenzieren kann?

{edit}
Code:
$line =~ /(..)/;
Die Zeile ist sinnlos. Sie matcht alles, was zwei beliebige Zeichen beinhaltet, und setzt eine Referenz drauf. Du holst dir aber weder den Rückgabewert noch dereferenzierst du das Matching.
 
Zuletzt bearbeitet:
Vielen Dank!
Damit werden die Doppelten Buchstaben zwar gefunden, aber in der Ersetzung erhalte ich nur einen von beiden.
Mit
Code:
s/([a-z])\1/($1$1)/g
gehts.

/edit:
Code:
$line =~ /(..)/;

Die Zeile ist sinnlos. Sie matcht alles, was zwei beliebige Zeichen beinhaltet, und setzt eine Referenz drauf. Du holst dir aber weder den Rückgabewert noch dereferenzierst du das Matching.
Ich weiss zwar nicht, wovon du redest, aber ich hab sie mal auskommentiert, und tut astrein!
:)
 
Zuletzt bearbeitet:
Ja, da werden aber auch Punkte mit eingeschlossen. Und ich will ausschliesslich Doppelbuchstaben.

Code:
s/([a-z])\1/($1$1)/g
Tut.

/edit:
gefaellt mir aber immer noch nicht so richtig.
Es kann nicht sein, dass ich zweimal hintereinander aus der Variablen $1 lesen muss.
Das muss anders gehen.

Aber heute bin ich dafuer zu erledigt. Nur 3std Schlaf fordern ihren Tribut.

Danke erstmal bis hierhin.
:)
 
Zuletzt bearbeitet:
Das matcht auch noch z.B. ?? oder !!. Warum nicht Buchstaben angeben, wenn er sie explizit (und nichts anderes) will? :)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Ja, da werden aber auch Punkte mit eingeschlossen. Und ich will ausschliesslich Doppelbuchstaben.

Code:
s/([a-z])\1/($1$1)/g
Tut.

/edit:
gefaellt mir aber immer noch nicht so richtig.
Es kann nicht sein, dass ich zweimal hintereinander aus der Variablen $1 lesen muss.
Das muss anders gehen.

Aber heute bin ich dafuer zu erledigt. Nur 3std Schlaf fordern ihren Tribut.

Danke erstmal bis hierhin.
:)

Code:
s/(([a-z])\2)/($1)/g

oder

Code:
s/([a-z])\1/($&)/g
 
Zuletzt bearbeitet:
Der is gut:
Code:
s/([a-z])\1/($&)/g

Aber verstehen tu ich es immer noch nicht:

Es wird in $1 eingelesen, und $& wird ausgegeben.

Hmm...
:think:

Naja, ist mein 3. Tag mit Perl :D
 
Der is gut:
Code:
s/([a-z])\1/($&)/g

Aber verstehen tu ich es immer noch nicht:

Es wird in $1 eingelesen, und $& wird ausgegeben.

Hmm...
:think:

Naja, ist mein 3. Tag mit Perl :D
$& gibt den ganzen gematchten String zurück, $1 ... $n jeweils den Inhalt der Klammer.
\1 ist eine Referenz auf die erste Klammer, also das [a-z]. Damit wird praktisch das Zeichen gedoppelt und es matcht eben auf alle doppelten Zeichen.
 
$& gibt den ganzen gematchten String zurück, $1 ... $n jeweils den Inhalt der Klammer.
\1 ist eine Referenz auf die erste Klammer, also das [a-z]. Damit wird praktisch das Zeichen gedoppelt und es matcht eben auf alle doppelten Zeichen.

Ah, das bringt etwas Licht in die Sache.

THX!
 
Code:
s/([a-z])\1/($1)/g
Kann mir ma jemand sagen, wieso ich noch im matchen nich mit $1 sondern nur mit \1 dereferenzieren kann?
fyi:

perldocs schrieb:
The bracketing construct ( ... ) creates capture buffers. To refer to the digit'th buffer use \<digit> within the match. Outside the match use "$" instead of "\". (The \<digit> notation works in certain circumstances outside the match. See the warning below about \1 vs $1 for details.) Referring back to another part of the match is called a backreference.
 

Ähnliche Themen

perl script, das Dateien aus einer Liste löscht

Domain vor frame include schützen

Hab die Xorg.0.log kopiert bekommen

Zurück
Oben