Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Perl-Programmierer gesucht (https://www.delphipraxis.net/40645-perl-programmierer-gesucht.html)

alcaeus 18. Feb 2005 18:00


Perl-Programmierer gesucht
 
Hallo Leute,

ich habe hier ein (mehr oder weniger schoenes) Perl-Script vor mir liegen, und moechte gerne wissen, was einzelne Zeilen bedeuten:

Code:
$cmd  = $ARGV[3];

$cmd=~ s/(.*);$/$1/eg;
$cmd=~ s/(.)/"%".uc(sprintf("%2.2x",ord($1)))/eg;
Die erste Zeile habe ich noch verstanden: der Variable "cmd" wird der Wert des vierten Parameters zugewiesen. Aber was bedeuten die anderen Befehle? Ich hab nur rausgefunden, dass es sich um Replace-Functions handelt, aber dann hat die Kombination aus Internet und meiner bescheidenen Logik versagt :(
Kann mir bitte jemand sagen, was hier gesucht bzw. ersetzt wird?

Und noch was: falls jemand erkennen sollte, woher die Zeilen kommen, erwaehnt es nicht, und an die anderen: fragt mich nicht woher sie kommen.

Greetz
alcaeus

[edit] :shock: 3000? :dance: [/edit]

alcaeus 19. Feb 2005 17:36

Re: Perl-Programmierer gesucht
 
Kommt schon Jungs, es muss doch jemanden geben, der ein bisschen Perl kann :cry:
Ich habe mittlerweile noch folgendes rausgefunden:
s/p/r/o ersetzt jedes Vorkommnis eines Patterns p mit r, unter beruecksichtigung der Optionen o
Doch was heisst das Pattern "(.*);$" bzw. der Replacement-String "$1"? Die Optionen habe ich bereits gefunden: g sorgt dafuer, dass jedes Vorkommen von p ersetzt wird, und e sagt der Funktion, den String als Perl-Expression zu bearbeiten. Das kompliziert das ganze dann doch einigermassen...

Kann mir jemand weiterhelfen?

Greetz
alcaeus

memphis 19. Feb 2005 17:53

Re: Perl-Programmierer gesucht
 
hallo

ich vermute mal, dass das "(.*)" für irgendetwas steht und das "$1" ist dann das irgendetwas :)
so ist es bei den meisten regulären ausdrücken. der schalter /s steht, wenn ich mich nicht ganz irre, dafür, dass der ganze String als eine Zeile angesehen wird.

habe nur ganz wenig mit perl gearbeitet, aber bei php bzw. c ist es auch so ungefähr..

ansonsten hat selfhtml auch einiges über perl, vieleicht bzw. hoffentlich wird dort auch auf reguläre Ausdrücke eingegangen.

Servus

Edit: Glück gehabt, vieleicht hilfts: http://de.selfhtml.org/cgiperl/sprache/regexpr.htm

fiasko 19. Feb 2005 18:31

Re: Perl-Programmierer gesucht
 
Zitat:

Zitat von alcaeus
Kommt schon Jungs, es muss doch jemanden geben, der ein bisschen Perl kann :cry:

Hat jemand gerufen?

Code:
$cmd  = $ARGV[3];
speichert den 3. Kommandozeilenparameter in $cmd

Code:
$cmd=~ s/(.*);$/$1/eg;
Der =~ Operator mapped für das Statement $cmd auf $_ (die Standardskalarvariable), denn s/// arbeitet immer mit der Standardskalarvariable. s/// ist einfach eine Ersetzung des regulären Ausdruckes (.*);$ durch den ersten Match $1. Die Buchstaben eg sind Parameter, g steht für global und bedeutet das die Ersetzung überall gemacht wird und nicht schon nach der ersten Ersetzung endet. Wofür e steht müßte man jetzt mal im Handbuch nachschauen... ich vermute etwas mit dem escapen. Die Zeile entfernt einfach ein endstehendes Semikola.

Code:
$cmd=~ s/(.)/"%".uc(sprintf("%2.2x",ord($1)))/eg;
Das s/// ersetzt hier alle Matches durch was ganz lustiges. Die uc() Funtkion gibt den Parameter in Großbuchstaben zurück, und sprintf macht das was man von sprintf erwartet. ord ist auch wie in Pascal zu verstehen, $1 ist wieder der Match. Es konvertiert als den ASCII-Wert aller Zeichen in 2stellige Hex-Zahlen mit nem % davor.

der Code ist aber ziemlich dumm, das geht auch kürzer und effektiver in Perl.

alcaeus 19. Feb 2005 18:36

Re: Perl-Programmierer gesucht
 
Hallo Luki,

das hilft mir schon viel weiter. Mit dem ersten Replace wird jedes Vorkommen von "12345;" am Ende von $cmd durch "12345" ersetzt.

Die zweite Zeile ersetzt dann jedes Zeichen in $cmd durch den entsprechenden Hex-Wert, jedenfalls wenn ich den String "%2.2x" richtig interpretiert habe. Ueber das 2.2 bin ich mir nicht ganz sicher, ich hab zwar gesehen dass eine Zahl nach dem %-Zeichen sicherstellt, dass die Zahl sicher so lang wird, aber was bedeutet das mit dem Punkt?
Kann das noch jemand erklaeren was das mit dem e-Parameter bedeutet? Wenn ich nun z.B. als Kommando "ls" uebergebe, was wuerde dann dieses "Interpretieren" machen?

@Fiasko: danke, das bestaetigt das was ich bisher rausgefunden habe :)

Greetz
alcaeus

fiasko 19. Feb 2005 18:51

Re: Perl-Programmierer gesucht
 
Hallo,

Zitat:

Zitat von alcaeus
@Fiasko: danke, das bestaetigt das was ich bisher rausgefunden habe :)

ups, wer lesen kann ist klar im Vorteil :oops:


wenn du man mal ins Perl-Manual schaut:

Zitat:

sprintf FORMAT, LIST
Returns a string formatted by the usual "printf"

...
Perl permits the following universally-known flags
between the "%" and the conversion letter:
...
number minimum field width
.number "precision": digits after decimal point for
floating-point, max length for string, minimum length
for integer
Die Parameter eg sind in der 2. Zeile uninteressant, in der dritten Zeile sorgt das dafür:

Zitat:

If single quotes are used,
no interpretation is done on the replacement
string (the "/e" modifier overrides this, how*
ever). Unlike Perl 4, Perl 5 treats backticks as
normal delimiters; the replacement text is not
evaluated as a command. If the PATTERN is delim*
ited by bracketing quotes, the REPLACEMENT has its
own pair of quotes, which may or may not be brack*
eting quotes, e.g., "s(foo)(bar)" or
"s<foo>/bar/". A "/e" will cause the replacement
portion to be treated as a full-fledged Perl
expression and evaluated right then and there.
spricht der sorgt dafür das die Funktionsaufrufe uc(..) ausgeführt werden.

alcaeus 19. Feb 2005 18:56

Re: Perl-Programmierer gesucht
 
Zitat:

Zitat von fiasko
ups, wer lesen kann ist klar im Vorteil :oops:

Ganz im Gegenteil, ich war mir nicht 100%ig sicher, und du hast diese Vermutungen bestaetigt.

Zitat:

spricht der sorgt dafür das die Funktionsaufrufe uc(..) ausgeführt werden.
Ok, dann waere das so ziemlich die Loesung des Problems. Vielen Dank euch beiden :)

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz