Schrift
[thread]7327[/thread]

tr///: bin/war verblüfft

Leser: 1


<< >> 9 Einträge, 1 Seite
pKai
 2005-10-11 16:44
#58613 #58613
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Folgendes kleines Problem hat mich ein paar Minuten zum Nachdenke gebracht:

Ich wollte mit einmaliger Anwendung vom tr aus
Code: (dl )
$_ = "2005-10-11 14:15:38"
Code: (dl )
$_ eq "20051011_141538"
machen.
Meine erste Versuch war
Code: (dl )
tr/ 0-9/_0-9/cd
, was aber nicht korrekt ist.
Wer kann überzeugend erklären, warum mein Ausdruck das macht, was er macht (Ergebnis: $_ eq "20051011 141538")?

Am Ende noch der Ausdruck, der tut, was ich wollte. Wer selber knobeln will, braucht ja die weiße Schrift auf weißem Grund nicht mit dem Cursor highlighten.


tr/ :-/_/d\n\n

<!--EDIT|pKai|1129034751-->
I sense a soul in search of answers.
sesth
 2005-10-11 17:22
#58614 #58614
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Quote
If the /c modifier is specified, the SEARCHLIST character set is complemented. If the /d modifier is specified, any characters specified by SEARCHLIST not found in REPLACEMENTLIST are deleted.


Du suchst nach dem Komplement von Leerzeichen und einer Ziffer. Da bleibt im Eingabestring eigentlich nur der Doppelpunkt. Mit /d löscht Du dann alles, was rechts nicht gefunden wird, als den Doppelpunkt.
Gruß
Thomas
vayu
 2005-10-11 17:42
#58615 #58615
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ich versteh nur bahnhof -.-
murphy
 2005-10-11 17:43
#58616 #58616
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Das Verhalten deines ersten Ausdruckes ist auf den ersten Blick komisch, aber gar nicht unlogisch, wenn man es sich mal systematisch überlegt:

* Das c-Flag komplementiert die Liste der zu ersetzenden Zeichen, weshalb also alles von Zeichen 0 bis ord(' ')-1, von ord(' ')+1 bis ord('0')-1 und von ord('9')+1 bis 255 ersetzt wird.

* Ersatz wird in der Liste der Ersatzzeichen nur für die Zeichen 0 bis 10 angegeben, die alle nicht im Eingabestring vorkommen.

* Das d-Flag weist Perl an alle Zeichen der Eingabeliste aus dem Eingabestring zu löschen, wenn für sie kein Ersatz in der Liste der Ersatzzeichen vorliegt, also in diesem Falle alles von Zeichen 11 bis ord(' ')-1, von ord(' ')+1 bis ord('0')-1 und von ord('9')+1 bis 255.

* Insgesamt läuft der Ausdruck in unserem Fall damit auf die folgende Anweisung hinaus: Lösche aus dem Eingabestring alle Zeichen, die nicht ' ', '0', '1', ... oder '9' sind.

(edit: emoticons deaktiviert)\n\n

<!--EDIT|murphy|1129038443-->
When C++ is your hammer, every problem looks like your thumb.
pKai
 2005-10-11 18:01
#58617 #58617
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Was gelöscht wird war ja nicht mein Problem.
Was mich offenbar so irritiert hatte, war die Tatsache, dass bei /cd garnicht mehr *ersetzt* wird (immerhin heißt die Fkt "tr" von "transl[iter]ate" ;) ).
Irgendwie hatte ich offenbar implizit erwartet, dass vor der beschriebenen Löschung noch diese Ersetzung durchgeführt wird.
So wie es ist, ist dann wohl egal, was man bei /cd in den Ersetzungsteil schreibt. (bei /d (ohne "c") allerdings nicht! siehe auch:)[quote=tr///,perldoc perlop](Note that this is slightly more flexible than the
behavior of some tr programs, which delete anything they find in
the SEARCHLIST, period.)[/quote](Direkter Folgesatz zu dem von seth zitiertem zum /d)

Edit: Das "slightly more flexible" ist dann ja das, was meine dann gefundene korrekte Lösung erst ermöglicht :)\n\n

<!--EDIT|pKai|1129039813-->
I sense a soul in search of answers.
sesth
 2005-10-11 18:23
#58618 #58618
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Ich denke, das Problem ist das Komplement. Wie soll da ein korrespondierendes Zeichen in der Ersetzungsliste gefunden werden. Mit
Code (perl): (dl )
tr/ 0-9/_0-9:::::::::::::::::::::::::::::::::::::::::/cd;

taucht der Doppelpunkt wieder auf, da es offensichtlich in der imaginären Suchliste an einer entsprechenden Position steht.
Gruß
Thomas
pKai
 2005-10-11 18:28
#58619 #58619
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=sesth,11.Oct..2005, 16:23]...taucht der Doppelpunkt wieder auf, ...[/quote]
Bei mir nicht.
Edit: Doch, hatte mich vertan. Damit wird es aber noch mysteriöser\n\n

<!--EDIT|pKai|1129041073-->
I sense a soul in search of answers.
sesth
 2005-10-11 18:36
#58620 #58620
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Für mich wird es klar. Stell Dir die Suchliste ausgeschrieben vor, d.h. nicht komplementär. Da muss dann an irgendeiner Stelle ein Doppelpunkt stehen. Wenn dann nicht an der entsprechenden Stelle der Ersetzungsliste ein Zeichen steht, wird es gelöscht. Durch das Komplement ist eben nicht definiert, wo in der Suchliste der Doppelpunkt steht.
Gruß
Thomas
pKai
 2005-10-11 19:41
#58621 #58621
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
OK, das ist dann auch "slightly more flexible, period"...
I sense a soul in search of answers.
<< >> 9 Einträge, 1 Seite



View all threads created 2005-10-11 16:44.