Die Wahrheit über HAL

Nicht ganz ernst gemeint:

function Get-Truth ([char[]]$c) { $c | % { [char](([int](„{0}“ -f [int]$c))+1) } }

Get-Truth „HAL“ -> „IBM“

Get-Truth „VMS“ -> „WNT“

Angeregt wurde ich zu der „Konstruktion“ (bei der ich ohne (!) .NET-String-Methoden auskommen wollte) beim Lesen in Bruce Payettes „PowerShell in Action – Teil 2“, das immer noch nicht da ist (lediglich die ersten sieben Kapitel stehen für jene Leser zur Verfügung, die bereit sind, das eBook bereits jetzt zu kaufen;), und das laut Verlag im Juni 2010 kommen soll. Die Version in seinem Buch war natürlich „etwas“ kürzer und eleganter.

Update: Nach dem Motto, es gibt immer noch eine kürzere Variante, wenn man nur lange genug herumprobiert:

function Get-Truth { [int[]] [char[]] $Args[0] | foreach { [char]($_+1)} }

Die erste „Fassung“ der obigen Funktion war etwas arg umständlich, auch der Nachfolger besticht noch nicht durch Eleganz und Kühnheit. Der „Trick“ der aktuellen Fassung besteht darin, die Zeichenkette , die in ihre Buchstaben zerlegt werden soll, zunächst in ein [char[]], also in ein Array von char-Werten (ein einzelnes Zeichen) zu „casten“ (sprich zu konvertieren). Der zweite „Trick“ besteht darin, dass man aus einem char, der in einen int „gecastet“ wird, den ASCII-Code erhält, der nur um eins erhöht werden muss. Durch erneutes Casten in ein char wird daraus wieder das Zeichen, das ausgegeben wird.

Update: Das Thema lässt mich nicht los;)

Filter (ein weiteres Thema, das ich in meinem PowerShell 2.0-Buch, das demnächst erscheinen wird, vergessen habe) sind sehr praktisch, da sie einen Befehlsblock pro Pipeline-Element ausführen (im Wesentlichen sind die syntaktisch die kürzere und vor allem lesbarere Variante):

filter Truth { [char](([byte][char]$_)+1) }

Die „Wahrheit“ liefert nun der folgende Aufruf:

„HAL“.ToCharArray()  | Truth

Natürlich ist das direkte Anhängen-Müssen von ToCharArray() nicht besonders elegant:

„HAL“ | & { process { $_.ToCharArray() }}  | Truth

Gemäß dem Motto „Es geht auch ohne direkten Aufruf von .NET-Methoden-Membern“ geht es auch ohne:

„HAL“ | & { process { [Char[]] $_ }}  | Truth

Schreibe einen Kommentar

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s