[Dresden-pm] [Tina Mueller] [Berlin-pm] Perl-Quiz-Frage

A. Pagaltzis pagaltzis at gmx.de
Do Okt 26 00:26:11 PDT 2006


* Steffen Schwigon <schwigon at webit.de> [2006-10-26 08:50]:
> Tina von Berlin.pm hat in deren Mailingliste ein interessantes
> Quiz rumgeschickt. Ich war überfordert und kann mir die
> Lösungen auch nicht erklären. Falls einer weiß, was passiert,
> Sport frei.

Perl macht keine Kopie vom Stringinhalt, um Captures
festzuhalten. Stattdessen sind $1 und Co als eine Art
automatischer Substring implementiert, der mit dem ursprünglichen
Skalar verbunden bleibt.

> From: Tina Mueller <tina.2003 at tinita.de>
> To: berlin-pm at pm.org
> Subject: [Berlin-pm] Perl-Quiz-Frage
> Date: Wed, 25 Oct 2006 14:49:30 +0200 (CEST)
> Message-ID: <Pine.LNX.4.61.0610251440120.5938 at lugosi.local>
> Sender: berlin-pm-bounces+schwigon=webit.de at pm.org
> List-Id: Mailingliste der Berliner Perl Mongers <berlin-pm.pm.org>
> 
> hier hab ich etwas schoenes gefunden, was damals noch ins perl-quiz
> gepasst haette:
> 
> (A) was gibt folgendes aus:
> perl -we '($x = "fou") =~ /.(.)/g; print $1; $x = "bar"; print $1'
> (1) oo
> (2) ou
> (3) oa

Nach dem Match ist $1 mit dem Substring 2..2 in $x verbunden. Die
Änderung von $x beeinflusst das nicht, daher produziert das
zweite `print` ein »a« als Ausgabe.

> (B) und fuer fortgeschrittene:
> was sieht man als ausgabe, wenn man folgendes macht:
> perl -we'($x = "fou") =~ /.(..)/g; print $1; $x = "b"; print $1'
> (1) ouu
> (2) ouuu
> (3) ouou

Hier passiert das gleiche, nur ist der Substring 1..2, der neue
String aber kürzer. Vorsicht: beim Verändern von $x wird die
Position nach dem Ende des neuen Strings mit "\0" überschrieben
und ersetzt somit das »o«.

So kommt also »ouu« heraus – genaugenommen aber ist es »"ou\0u"«.

Gruss,
-- 
#Aristoteles
*AUTOLOAD=*_;sub _{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1};
&Just->another->Perl->hacker;