Thomas: JAPH

moin

kann mir einer dieses schöne japh erklären?
die vielen * verwirren mich ein bisschen :)

$_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
for ($*=******;$**=******;$**=******) {$**=*******s*..*qq}
print chr 0x$& and q
qq}*excess********}

  1. Hallo Thomas,

    kann mir einer dieses schöne japh erklären?

    In der Tat, da kennt jemand Perl _sehr_ genau. Cool. Wer ist der
    Autor?

    $_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;

    Hier wird codiert 'Just Another Perl Hacker' gespeichert.

    for ($*=******;$**=******;$**=******) {$**=*******s*..*qq}

    $*=****** setzt $* auf 1. Bei der Ausfuehrung von $**=****** behaelt
    $* den aktuellen Wert. Dann wird mit { der Anfang der Schleife
    eingeleitet. Jetzt wirds komplizierter. Die Schleife wird eroeffnet
    und es wird $* wieder multipliziert, allerdings unter anderem mit
    dem Ergebnis einer Suche-und-Ersetzen-Aktion, die mit dem s
    eingeleitet wird. Dabei werden immer zwei Zeichen (..) ersetzt durch
    einen durch den Quoting-Operator qq eingeleiteten String. Der
    Quoting-Begrenzer ist dabei das Zeichen '}'.

    print chr 0x$& and q
    qq}*excess********}

    Hier wird der String dann fortgesetzt. Der String, der fuer die zwei
    Zeichen zusammengesetzt wird, ist etwa so aufgebaut:

    print chr 0x<zeichen1><zeichen2> and q
    qq

    So, und jetzt wird ein netter Trick angewandt: Perl ist relativ
    unempfindlich, was das Doppelt-definieren von Modifiern fuer Regexe
    angeht. Die Ausnahme bildet das e-Flag. Wird das e-Flag doppelt
    genannt, so wird zuerst der Esetzungs-RegEx-Inhalt ausgefuehrt (in diesem Fall das q, was den oben erwaehnten Text ergibt) und fuehrt
    dieses Ergebnis dann aus. Das heisst, es wird eine &&-Verknuepfung
    mit jeweils zwei der Zeichen gemacht. Das ergibt die Dekodierung zu
    dem 'Just another Perl Hacker'. Ich schreibe das ganze mal in einem
    verstaendlicheren Code:

    $_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
    while(m/(..)/g) {
      print "\nq" && chr(eval("0x$1"));
    }

    Wie gesagt, ziemlich cool gemacht :-)

    Grüße,
     CK

    --
    Q: God, root, what's the difference?
    A: God is merciful.
    http://wwwtech.de/
    1. Hallo Christian,

      Wie gesagt, ziemlich cool gemacht :-)

      Jow, finde ich auch - coole mucke!
      Und vielen Dank für deine Erläuterungen!

      Gruss, Rolf

      --
      KnowHow veröffentlichen statt Patentieren!
    2. thx vielmals für die gute erklärung.

      In der Tat, da kennt jemand Perl _sehr_ genau. Cool. Wer ist der
      Autor?

      Abigail. hier findest du noch mehr beispiele: http://www.cpan.org/misc/japh
      die anderen versteh ich so halbwegs.

      ich hab den code auch mal ein bisschen umgeschrieben:

      $_ = '4a75737420616e6f74686572205065726c204861636b65720a';
      for ($* = 1; $* *= 1; $* *= 1)
          {
          $* *= 1 * s|..|qq/print chr 0x$& and q qq/|excess * 1
          }

      aber warum sind 6 * ein 1? hat das was mit einem path zu tun?

      1. Hallo Thomas,

        In der Tat, da kennt jemand Perl _sehr_ genau. Cool. Wer ist der
        Autor?

        Abigail.

        Ah, haette ich mir denken koennen.

        hier findest du noch mehr beispiele: http://www.cpan.org/misc/japh

        Jepp, kannte ich schon :-)

        ich hab den code auch mal ein bisschen umgeschrieben:

        $_ = '4a75737420616e6f74686572205065726c204861636b65720a';
        for ($* = 1; $* *= 1; $* *= 1)
            {
            $* *= 1 * s|..|qq/print chr 0x$& and q qq/|excess * 1
            }

        aber warum sind 6 * ein 1? hat das was mit einem path zu tun?

        Nein, das hat was mit etwas ganz anderem zu tun :-) Sorry, hatte
        ich vergessen zu erwaehnen.

        ****** wird vom Tokenizer in einen solchen Baum zerteilt:

        **
           /  \   *    *
          |    |
          *    *

        Der **-Operator ist der Potenz-Operator. Der * zeigt einen Typeglob
        an. Und das Ziel des Typeglobs ist *. ****** ist also das gleiche wie

        *main::* ** *main::*

        waehrend $* *= ****** das gleiche ist wie

        $* *= *main::* ** *main::*

        Und damit ist der erste Ausdruck synonym mit $* = 1 und der zweite
        Ausdruck synonym mit $* *= 1. Damit duerfte es dir auch Moeglich
        sein, den zweiten Ausdruck mit dem s/// zu verstehen und
        auszuwerten.

        Grüße,
         CK

        --
        Ich bewundere wirklich den Sinn der Bienen für kollektive Verantwortung. Obwohl sich einzelne Bienen hin und wieder bekämpfen, herrscht zwischen Ihnen grundsätzlich ein starkes Gefühl für Eintracht und Zusammenarbeit. Wir Menschen gelten als sehr viel weiter entwickelt, doch mitunter rangieren wir sogar hinter kleinen Insekten.
        http://wwwtech.de/
        1. Der **-Operator ist der Potenz-Operator. Der * zeigt einen Typeglob

          thx, aber ist noch schwierig zu begreiffen, wenn man nicht weiss was ein typeglob ist. o_O aber die richtung habe ich wenigstens verstanden.
          ich seh das schon kommen, ich muss die perl docs doch noch lesen :(