Stringbearbeitung

Hi @ll,

Ich möchte aus einem Skalar eine bstimmte Zeichenkette / einzelnes Zeichen entfernen.

Der Skalar sieht in etwa so aus :

„-----------c:\tmp---------“

Es kommt aber auch vor das dereingebettete Pfad sich über 2 Zeilen teilt, also in etwa :

„c:\tmp\tm\t\src\inc\lib\win“
„------------dows-----------“

Ich kann also nicht einfach substr verwenden da dies einen festen Offset benötigt.

Es kommt in dem Skalar alles variabel vor, ich muss also das Zeichen „-“ ausblenden. Das habe ich mit „@blabla = grep (!/^-/,@check_arr[0]);“
versucht, klappt aber nicht.

Gibt es eine Methode der ich einfach einen Skalar übergeben kann plus einem String der daraus gelöscht werden soll, oder kann mir jemand den richtigen regulären Ausdruck nennen ?

Dank schon mal im Vorraus
MfG

Der Skalar sieht in etwa so aus :

„-----------c:\tmp---------“

Es kommt aber auch vor das dereingebettete Pfad sich über 2
Zeilen teilt, also in etwa :

„c:\tmp\tm\t\src\inc\lib\win“
„------------dows-----------“

Ich kann also nicht einfach substr verwenden da dies einen
festen Offset benötigt.

Gibt es eine Methode der ich einfach einen Skalar übergeben
kann plus einem String der daraus gelöscht werden soll, oder
kann mir jemand den richtigen regulären Ausdruck nennen ?

Wenn du einfach nur die Striche am Anfang und am Ende von $var gelöscht haben willst:

$var =~ s/^-\*([^-]+.\*[^-]+)-\*$/$1/;

Mit map kannst du das dann über ein ganzes Array @a jagen:

map s/^-\*([^-]+.\*[^-]+)-\*$/$1/, @a;

Wenn du einfach nur die Striche am Anfang und am Ende von $var
gelöscht haben willst:

$var =~ s/^-*([^-]+.*[^-]+)-*$/$1/;

Mit map kannst du das dann über ein ganzes Array @a jagen:

map s/^-*([^-]+.*[^-]+)-*$/$1/, @a;

Falls mal noch einer sowas in die Richtung machen will und nich weiter weiß, hier die elegante Lösung (nach nach ewigem Suchen und Ausprobieren drauf gekommen *gg*):

@check_arr[0] =~tr/-/ /;

„tr“ ersetzt bestimmte Zeichen in einem String bzw. löscht diese.
Syntax

„$alter_neuer_skalar =~ tr /alter String/neuer String/;“

Good Luck ^^

@check_arr[0] =~tr/-/ /;

Dir ist aber schon klar, dass ein ‚-‘ durchaus in einer Pfadangabe vorkommen kann, oder? Insofern ist die ganze Codierung ein wenig gefährlich. Deshalb der einigermaßen umständliche Ausdruck.

Das stimmt natürlich, daran hab ich in der Hitze des Eifers nicht gedacht. Das könnte ich aber vernachlässigen da es hier um einen Report eines Metriktools geht und der exakte Pfad von ein paar Files nicht weiter relevant ist, es geht mehr um die zugehörig ermittelten Werte der Files und deren Summe, egal.

Tatsächlich sieht die Zeile folgendermaßen aus :
„----Y:\S7KBS_26\s7sfm\inc----| |----X:\S7KBS_26\s7sfm\inc----“

Da wirds schon bissl komplizierter aber mit dem nem split auf „|“
und einem „$var =~ s/^-*([^-]+.*[^-]+)-*$/$arr[0]/;“
und das gleiche nochma auf $arr[2] sollte das dann auch perfekt funktionieren.

Danke
MfG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Noch eine kleine Frage zu dem Thema :

Ich mache ein

$line =~ tr /(\s+)/;/;

In dieser Zeile werden mir seltsamerweise alle „s“-Zeichen mit einem „;“ ersetzt. \s steht doch aber bei regulären Ausdrücken für Whitespaces.

Wer weiß was ?

Hi Mario,
tja darauf bin ich auch schon mal reingefallen (wer nicht). tr arbeitet nicht mit regulären Ausdrücken, sondern führt seine Ersetzung nur relativ stumpf Zeichen für Zeichen aus - deswegen aber auch sauschnell.

Schnell noch in ‚perldoc perlop‘ nachgeschaut:

tr/SEARCHLIST/REPLACEMENTLIST/cds
 y/SEARCHLIST/REPLACEMENTLIST/cds
 Transliterates all occurrences of the characters
 found in the search list with the corresponding
 character in the replacement list. It returns the
 number of characters replaced or deleted. If no
 string is specified via the =~ or !~ operator, the
 $\_ string is transliterated. (The string specified
 with =~ must be a scalar variable, an array element,
 a hash element, or an assignment to one of those,
 i.e., an lvalue.)

 A character range may be specified with a hyphen, so
 tr/A-J/0-9/ does the same replacement as
 tr/ACEGIBDFHJ/0246813579/. For sed devotees, y is
 provided as a synonym for tr.

 ... usw. usw. ...

Tja, da ist von REs leider nicht die Rede.

Gruß
bernhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]