<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tobi&#039;s Blog &#187; Perl::Kinky</title>
	<atom:link href="http://www.fukurama.org/wordpress/category/technik/die-perl-eckelecke/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fukurama.org/wordpress</link>
	<description></description>
	<lastBuildDate>Tue, 17 Jan 2012 20:23:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Stolperfallen in Perl&#8217;s Spezialmethoden: DESTROY</title>
		<link>http://www.fukurama.org/wordpress/2008/07/15/stolperfallen-in-perls-spezialmethoden-destroy/</link>
		<comments>http://www.fukurama.org/wordpress/2008/07/15/stolperfallen-in-perls-spezialmethoden-destroy/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 22:16:05 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl::Kinky]]></category>
		<category><![CDATA[destroy]]></category>
		<category><![CDATA[eval]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=203</guid>
		<description><![CDATA[Durch einen Kollegen bin ich auf ein Problem aufmerksam geworden, was ein verwirrendes Verhalten von globalen Variablen in Verbindung mit DESTROY beschreibt. Man nehme folgenden Code und betrachte speziell den unteren eval-Block: use Test::More tests => 1; { package Foo; sub new { bless([]) } sub DESTROY { eval { die('destroy'); } } sub bar [...]]]></description>
			<content:encoded><![CDATA[<p>Durch einen Kollegen bin ich auf ein Problem aufmerksam geworden, was ein <a href="http://rt.perl.org/rt3/Public/Bug/Display.html?id=38034">verwirrendes Verhalten von globalen Variablen in Verbindung mit DESTROY</a> beschreibt. Man nehme folgenden Code und betrachte speziell den unteren eval-Block:</p>
<p><code>use Test::More tests => 1;<br />
{<br />
	package Foo;<br />
	sub new {<br />
		bless([])<br />
	}<br />
	sub DESTROY {<br />
		eval {<br />
			die('destroy');<br />
		}<br />
	}<br />
	sub bar {<br />
		die('bar');<br />
	}<br />
}<br />
eval {<br />
	my $foo = Foo->new();<br />
	$foo->bar();<br />
};<br />
main::diag($@);</code></p>
<p>in $@ sollte eigentlich sowas wie <em>bar at Test.pm line x</em> erscheinen, aber er ergibt <em>destroy at&#8230;</em>. Was ist also passiert? Es ist, wie in der &#8220;Fehlerbeschreibung&#8221; erwähnt eigentlich kein Fehler, sondern eine Nebenwirkung davon, dass in Perl fast alles mit globalen Variablen gelöst wird. Wenn man den Code ein wenig erweitert, sieht man deutlich, was passiert:</p>
<p><code>#!perl -T<br />
use Test::More tests => 1;<br />
{<br />
	package Foo;<br />
	sub new {<br />
		main::diag('new() called');<br />
		bless([])<br />
	}<br />
	sub DESTROY {<br />
		main::diag('DESTROY() called');<br />
		eval {<br />
			die('destroy');<br />
		}<br />
	}<br />
	sub bar {<br />
		main::diag('bar() called');<br />
		die('bar');<br />
	}<br />
}<br />
main::diag('eval-START');<br />
eval {<br />
	my $foo = Foo->new();<br />
	$foo->bar();<br />
}; # HERE!<br />
main::diag('eval-END');<br />
like($@, qr/^destroy/, 'croak in DESTROY()');</code></p>
<p>Folgende Ausgabe wird erzeugt:<br />
<code># eval-START<br />
# new() called<br />
# bar() called<br />
# DESTROY() called<br />
# eval-END</code><br />
Zwischen dem Aufruf von <strong>bar()</strong> und <strong>eval-end</strong> mogelt sich das <strong>DESTROY</strong> frech dazwischen. Es gibt hier eine Nebenläufigkeit, da $foo am Ende des Eval-Blockes nicht mehr existiert und der GarbadgeCollector artig DESTROY() auf das Objekt aufruft. Da es aber nur eine Kopie von $@ gibt, wird der Inhalt durch das DESTROY-eval{}  einfach überschrieben, denn das soll eval{} bei jedem Aufruf ja auch tun.</p>
<p>In der &#8220;Fehlerbeschreibung&#8221; ist als mögliche Lösung angegeben, man soll immer <strong>local</strong> verwenden, um z.B. $@ nicht zu überschreiben. Um auf &#8220;Hat Fehler&#8221; zu prüfen würde ich lieber ein<br />
<code>my $ok = eval {<br />
  #...some code<br />
  return 1;<br />
};</code><br />
verwenden, da man da erst gar nicht auf $@ angewiesen ist. Der Inhalt von $@ wird damit aber immer noch überschrieben werden.</p>
<p>Dieses Verhalten hat mir mal wieder gezeigt, dass mit allen Spezialmethoden von Perl, also import(), BEGIN, CHECK, END, INIT, DESTROY() und alle anderen, die zu bestimmten Ereignissen aufgerufen werden, immer sehr umsichtig umgegagnen werden muss. Am besten viele Diagnosemeldungen ausgeben lassen, damit man nicht den Überblick verliert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/07/15/stolperfallen-in-perls-spezialmethoden-destroy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Merkwürdiges Verhalten bei lvalue</title>
		<link>http://www.fukurama.org/wordpress/2008/07/11/merkwurdige-fehlermeldungen-bei-lvalue/</link>
		<comments>http://www.fukurama.org/wordpress/2008/07/11/merkwurdige-fehlermeldungen-bei-lvalue/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 21:31:08 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl::Kinky]]></category>
		<category><![CDATA[attribute]]></category>
		<category><![CDATA[lvalue]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=201</guid>
		<description><![CDATA[Ich habe mich heute mal mit dem lvalue Attribute auseinander setzen müssen und einige Unstimmigkeiten festgestellt. Es macht einen Unterschied, ob man einen Rückgabewert implizit oder explizit liefert. Implizit, also einfach der letzte Wert der Methode, funktioniert für lvalue. Explizit, also mit return, funktioniert nicht. Return legt wohl generell eine Kopie der Rückgabevariablen an, denn [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mich heute mal mit dem lvalue Attribute auseinander setzen müssen und einige Unstimmigkeiten festgestellt.</p>
<ol>
<li>Es macht einen Unterschied, ob man einen Rückgabewert implizit oder explizit liefert. Implizit, also einfach der letzte Wert der Methode, funktioniert für lvalue. Explizit, also mit return, funktioniert nicht. Return legt wohl generell eine Kopie der Rückgabevariablen an, denn bei dem unten stehenden Code wird mit return der Wert der Variablen nie gesetzt. Es wird aber auch kein Fehler geworfen. Dieser Unterschied erklärt auch, warum das implizite return bei Lasttests um ein vielfaches schneller ist. Für die Erbsenzähler <img src='http://www.fukurama.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  das liegt im unteren Âµs Bereich, Für normale Programmierarbeiten also uninteressant.</li>
<li>Beim Dekorieren einer lvalue-Methode kann kein <strong>goto SUBREF</strong> verwendet werden. Dort gibt es eine Fehlermeldung, dass eben dieses goto nicht umgebogen werden kann, wobei goto in der Form ja einfach den Kontext wechselt und an der anderen Stelle weiter macht. Was also passiert da im Hintergrund? Und: will ich das wirklich wissen oder kann ich danach nie mehr ruhig schlafen?</li>
<li>Die Stelle, die die goto-Fehlermeldung wirft, ist entweder zu dumm oder zu schlau. Nach einem solchen goto wird ja in den Kontext der angegebenen Methode gewechselt und ALLE Codezeilen nach diesem goto werden nicht mehr ausgeführt. Wenn ich in die lvalue-Methode aber ein return nach dem goto setze oder irgend einen impliziten Rückgabewert, dann meckert er nicht und alles Funktioniert, wie es soll. Ich traue mich einfach nicht, in den C-Code zu sehen&#8230; *grusel*</li>
<li>Die Art des Wertes, den die lvalue-Methode liefert spielt ja eine Rolle. Es muss zwingend eine änderbare Variable, also z.B. <strong>$text</strong> und NICHT <strong>&#8216;text&#8217;</strong>, sein. Das ist ja verständlich, da dieser Variablen ja ein Wert zugewiesen werden soll. Ein <strong>undef</strong> liefert auch eine Fehlermeldung. Ein <strong>return undef;</strong> oder <strong>return ();</strong> geht aber wieder. Was liegt da für ein Code dahinter, dass das so merkwürdig reagiert? Vielleicht wird ja bei explizitem return alles in eine temporäre Variable gesetzt, aber wozu? Fragen über Fragen&#8230;</li>
<li>Noch so nebenbei, weil ich dadurch einige Zeit nach einem Fehler gesucht habe: in der MODIFY_CODE_ATTRIBUTES Methode, mit der Attribute selber definiert und behandelt werden können, kommen Perl-Interne Attribute, also z.B. lvalue, nie an.</li>
</ol>
<p>Hier mal ein Code-Beispiel für die ersten zwei beschriebenen Verhaltensweisen:<br />
<code>use strict;<br />
use warnings;<br />
use Test::More 'no_plan';<br />
our $bar;<br />
sub foo : lvalue {<br />
	$bar;<br />
	#return $bar; # Uncomment this line will result in an error (1)<br />
}<br />
sub bar : lvalue {<br />
	goto &foo;<br />
	die 'ha!'; # never reached<br />
	return;# Remove this will raise an error (2 + 3)<br />
}<br />
is(bar() = 'baz', 'baz', 'set');<br />
is(bar(), 'baz', 'get');</code></p>
<p>Und eine letzte Frage: gibt es irgendwo eine detaillierte Doku dazu oder ist es wie mit PerlXS ala &#8220;wurschtel dich halt durch&#8221;?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/07/11/merkwurdige-fehlermeldungen-bei-lvalue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scalar::Util und die Hoffnung</title>
		<link>http://www.fukurama.org/wordpress/2008/06/30/scalarutil-und-die-hoffnung/</link>
		<comments>http://www.fukurama.org/wordpress/2008/06/30/scalarutil-und-die-hoffnung/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 11:08:37 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl::Kinky]]></category>
		<category><![CDATA[inheritation]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[universal]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=199</guid>
		<description><![CDATA[Über ein Modul im CPAN, wo sich über die direkte Benutzer von UNIVERSAL::isa als statische Methode beschwert wurde, wurde ich auf das Modul Scalar::Util aufmerksam. Das wurde nämlich als sichere Alternative genannt um heraus zu finden ob ein Scalar &#8220;geblessd&#8221; wurde und wenn ja, mit was. Generell finde ich die direkte Benutzer von UNIVERSAL-Methoden auch [...]]]></description>
			<content:encoded><![CDATA[<p>Über ein Modul im CPAN, wo sich über die direkte Benutzer von UNIVERSAL::isa als statische Methode beschwert wurde, wurde ich auf das Modul Scalar::Util aufmerksam. Das wurde nämlich als sichere Alternative genannt um heraus zu finden ob ein Scalar &#8220;geblessd&#8221; wurde und wenn ja, mit was.</p>
<p>Generell finde ich die direkte Benutzer von UNIVERSAL-Methoden auch unpraktisch, weil man z.B. Dekorierern so jede Chance nimmt, sich als fremde Klasse aus zu geben. Also habe ich mir die Methode mal angesehen, und fand folgenden Code vor:</p>
<p><code>[...]<br />
eval < <'ESQ' unless defined &dualvar;<br />
use vars qw(@EXPORT_FAIL);<br />
push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype);<br />
# The code beyond here is only used if the XS is not installed<br />
# Hope nobody defines a sub by this name<br />
sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }<br />
sub blessed ($) {<br />
  local($@, $SIG{__DIE__}, $SIG{__WARN__});<br />
  length(ref($_[0]))<br />
    ? eval { $_[0]->a_sub_not_likely_to_be_here }<br />
    : undef<br />
}<br />
[...]</code><br />
Quelle: http://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/lib/Scalar/Util.pm</p>
<p>Ok, es wird nur verwendet, wenn der C-Code nicht ausgeführt werden kann, aber eine Methode <strong>a_sub_not_likely_to_be_here</strong> in Universal ungefragt zu hinterlegen um zu prüfen, ob es ein Objekt ist? Bäää! Von wegen <cite>Hope nobody defines a sub by this name</cite>. Wohl eher <em>Hope nobody use this module</em>, denn wenn der Perl-Code schon so aussieht&#8230; dann ist der C-Code wohl auch gaaanz toll. Hoffentlich?!?</p>
<p>Nur so nebenbei *klugscheiß*: Prüfungen auf <del datetime="2008-07-01T04:52:50+00:00">&#8220;ist ein Objekt der Klasse&#8221;</del> <ins datetime="2008-07-01T04:52:50+00:00">&#8220;ist ein Objekt&#8221;</ins> gehen ganz gut per <del datetime="2008-07-23T10:12:36+00:00"><strong>Universal::isa(ref($obj), &#8216;UNIVERSAL&#8217;)</strong></del>, aber das war in dem Fall wohl zu einfach <ins datetime="2008-07-01T04:52:50+00:00"><del datetime="2008-07-23T10:12:36+00:00">(obwohl es auch passieren kann, dass es eine Klasse namens &#8216;HASH&#8217; gibt, dann ist die Prüfung natürlich nicht korrekt)</del></ins>. Aber man wollte wohl den statischen Aufruf von Universal::isa um jeden Preis umgehen.</p>
<p><ins datetime="2008-07-23T10:07:38+00:00">Nachtrag: Man sollte den Code besser testen bevor man was schreibt. Auf ein Objekt kann sicher gestetet werden per <strong>die &#8220;obj ist ein Objekt&#8221; if(ref($obj) &#038;&#038; UNIVERSAL::isa($obj, &#8216;UNIVERSAL&#8217;))</strong></ins></p>
<p>Noch mal zur Erinnerung, und für Micha: Perl rockt! Das CPAN aber nicht! Oder zumindest nur in sehr seltenen Fällen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/06/30/scalarutil-und-die-hoffnung/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vorhandensein von Methoden in Klassen prüfen</title>
		<link>http://www.fukurama.org/wordpress/2008/04/17/vorandensein-von-methoden-in-klassen-prufen/</link>
		<comments>http://www.fukurama.org/wordpress/2008/04/17/vorandensein-von-methoden-in-klassen-prufen/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 19:48:12 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl::Kinky]]></category>
		<category><![CDATA[subroutine]]></category>
		<category><![CDATA[symboltable]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=189</guid>
		<description><![CDATA[Wenn man wissen will, ob eine Methode in einer Klasse nur deklariert (sub method;) oder ob eben auch ein Methodenkörper existiert (sub method { die 1; }) sollte man sich nicht nur auf can() verlassen. sub existing_sub; sub defined sub { die 1; } print __PACKAGE__->can('notexisting_sub'); #false print exists(&#038;notexisting_sub); # false print defined(&#038;notexisting_sub); # false [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man wissen will, ob eine Methode in einer Klasse nur deklariert (<em>sub method;</em>) oder ob eben auch ein Methodenkörper existiert (<em>sub method { die 1; }</em>) sollte man sich nicht nur auf can() verlassen.</p>
<p><code>sub existing_sub;<br />
sub defined sub { die 1; }<br />
print __PACKAGE__->can('notexisting_sub'); #false<br />
print exists(&#038;notexisting_sub); # false<br />
print defined(&#038;notexisting_sub); # false<br />
print __PACKAGE__->can('existing_sub'); #true<br />
print exists(&#038;existing_sub); # true<br />
print defined(&#038;existing_sub); # false<br />
print __PACKAGE__->can('defined_sub'); #true<br />
print exists(&#038;defined_sub); # true<br />
print defined(&#038;defined_sub); # true</code></p>
<p>Der Aufruf einer Methode, die nur deklariert, führt zu einem &#8220;<strong>Undefined subroutine .. called</strong>&#8221; fehler, den man ja eigentlich mit dem can() verhindern wollte. Mir ist noch nie eine solche, blanke Deklaration über den Weg gelaufen, aber man weiß ja nie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/04/17/vorandensein-von-methoden-in-klassen-prufen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perl und Prototypen</title>
		<link>http://www.fukurama.org/wordpress/2008/04/14/perl-und-prototypen/</link>
		<comments>http://www.fukurama.org/wordpress/2008/04/14/perl-und-prototypen/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 23:28:52 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl::Kinky]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=186</guid>
		<description><![CDATA[Nur vorab: ich bin nicht gegen Perl, sondern eigentlich dafür Punkt eins: You see, &#8220;prototypes&#8221; were really a bug fix. (Quelle: http://library.n0i.net/programming/perl/articles/fm_prototypes: Far More Than Everything You&#8217;ve Ever Wanted to Know about Prototypes in Perl die Quelle wurde leider entfernt) Das ist schon mal irgendwie nicht so toll. Punkt zwei: ich habe versucht die bless() [...]]]></description>
			<content:encoded><![CDATA[<p>Nur vorab: ich bin nicht gegen Perl, sondern eigentlich dafür <img src='http://www.fukurama.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Punkt eins: <cite>You see, &#8220;prototypes&#8221; were really a bug fix.</cite> (Quelle: http://library.n0i.net/programming/perl/articles/fm_prototypes: Far More Than Everything You&#8217;ve Ever Wanted to Know about Prototypes in Perl <ins datetime="2008-09-23T15:05:43+00:00">die Quelle wurde leider entfernt</ins>) Das ist schon mal irgendwie nicht so toll.</p>
<p>Punkt zwei: ich habe versucht die bless() Funktion zu dekorieren und musste mit erschrecken feststellen, dass deren Prototyp mal wieder voller (Schwarz-)Magie steckt. Definieren kann man folgendes in einem Prototyp:</p>
<dl>
<dh>@</dh></p>
<dd>Der &#8220;Rest&#8221; der Parameter. Schnappt sich ALLE Parameter und fügt sie ganz normal an @_ an, Macht nur am Ende eines Prototyps Sinn. Eine normale Funktion kann also ohne Prototyp oder mit sub test(@) {} geschrieben werden. Das macht keinen Unterschied.</dd>
<p><dh>%</dh></p>
<dd>Gleichbedeutend mit @</dd>
<p><dh>\@</dh></p>
<dd>Ein Array, und zwar wirklich eine Variable die mit @ beginnt, wie z.B. @test. Listen sind nicht erlaubt. (1,2,3) geht nicht! %test, was intern ja auch nur eine Liste ist, auch nicht. In @_ wird eine Referenz auf das Array als einzelner Parameter eingefügt.</dd>
<p><dh>\%</dh></p>
<dd>Ein Array, und zwar wirklich eine Variable die mit % beginnt, wie z.B. %test. Listen sind nicht erlaubt. (a => 1, b => 2, c => 3) geht nicht! In @_ wird eine Referenz auf den Hash als einzelner Parameter eingefügt.</dd>
<p><dh>$</dh></p>
<dd>Ein Scalar. Steht an der Stelle ein Array, ein Hash oder eine Liste, wird in @_  nur die Anzahl der Elemente eingefügt. Ansonsten der Wert des Parameters. Es ist im Grunde so, als würde man um seinen Parameter ein <strong>scalar()</strong> schreiben</dd>
<p><dh>\$</dh></p>
<dd>Eine Scalar, KEIN reiner Text! Es MUSS eine Variable sein die mit $ beginnt. In @_ wird eine Referenz auf den Scalar eingefügt</dd>
<p><dh>\*</dh></p>
<dd>Ein Glob, und NUR ein solcher. Nicht etwa &#8220;irgendeine Variable&#8221;. In @_ wird eine Referenz auf den Glob eingefügt</dd>
<p><dh>*</dh></p>
<dd>Ein Glob ODER alles andere. Bei einem Glob wird in @_ wird eine Referenz auf den Glob eingefügt. Bei einem Array oder einer Liste, die hier mal funktioniert, verhält es sich wie $. Bei einer Subroutine verhält es sich wie &#038; (bzw auch $ macht da das gleiche).</dd>
<p><dh>&#038;</dh></p>
<dd>Eine Funktionsreferenz oder ein Block. Wenn per <strong>sub {&#8230;}</strong> die Funktion als Referenz übergeben wird, wird die Referenz einfach in @_ gehängt. Wird das <strong>sub</strong> weggelassen, also nur ein Block übergeben, wirds ganz verrückt. Dann MUSS beim Funktionsaufruf <del datetime="2008-04-14T08:06:40+00:00">die Klammer weggelassen werden,</del> das Komma nach dem Block weggelassen werden und es MUSS der erste Parameter sein. grep und sort sind z.B. so Kandidaten, die das verwenden.</dd>
<p><dh>\&#038;</dh></p>
<dd>Gleichbedeutend mit &#038;</dd>
<p><dh>;</dh></p>
<dd>Trennt Pflich- von den optionalen Parametern</dd>
</dl>
<p>Bei bless() ist es nun so, dass der Prototyp eigentlich bless(\@;\@) ist, aber eben auch wieder nicht. Denn in dem speziellen Fall erlaubt das \@ auch Listen. Das Führt zwar am Ende zu einem Laufzeitfehler, funktioniert aber erst mal.</p>
<p>Und auch fraglich ist die Tatsache, dass der zweite Parameter von bless() ebenfalls eine Liste sein kann. Das letzte Element ist dann die &#8220;Klasse&#8221;, mit der geblesst wird. Aber was ist mit dem Rest? Ist das einfach ein Fehler oder passiert damit im Hintergrund irgendwas &#8230; ganz tolles?!?</p>
<p>Und das wichtigste: schlafe ich vieleicht einfach besser, wenn ich in dem Punkt unwissend bleibe?</p>
<p>Punkt 3, nur der vollständigkeit halber: Prototypen greifen nur, wenn man die Funktion direkt und ohne &#038; benutzt. Indirekt, per OO also, oder per &#038;$sub_ref() oder ähnliches geht nicht. Prototypen sind also NUR für global verfügbare Funktionen, oder Funktionen der eigenen Klasse sinnvoll (oder auch nicht).</p>
<p>PS: auch noch schon und auch aus obiger Quelle <cite>Since you gave Perl a ridiculous request, Perl dutifully provides you in return a ridiculous response&#8211;but not an error; oh no, not that!</cite></p>
<p><ins datetime="2008-04-14T09:14:02+00:00">Nachtrag: bless() hat den Prototyp (\@;$), nur verhält sich $ anders als gedacht. Steht dort eine Liste, wird das letzte Element verwendet. Ist es ein @Array, dann wird die länge ausgegeben. Ist das nicht toll?</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/04/14/perl-und-prototypen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Schlechte CPAN-Module (Teil 2): CGI</title>
		<link>http://www.fukurama.org/wordpress/2008/03/14/schlechte-cpan-module-teil-2-cgi/</link>
		<comments>http://www.fukurama.org/wordpress/2008/03/14/schlechte-cpan-module-teil-2-cgi/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 18:36:14 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl::Kinky]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[cpan]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=176</guid>
		<description><![CDATA[Module, die sich als Eierlegende-Wollmilch-Sau geben, haben oft ein Problem: sie können zu viel und irgendwie nichts richtig. Das Gefühl hab ich beim CGI-Modul schon lange. Und heute wurde es auch bewiesen. Ich habe mir leider nie die Mühe gemacht in die CPAN-Bugliste vom CGI-Modul zu sehen. Hätte ich&#8217;s man bloß getan. Insgesamt sind derzeit [...]]]></description>
			<content:encoded><![CDATA[<p>Module, die sich als Eierlegende-Wollmilch-Sau geben, haben oft ein Problem: sie können zu viel und irgendwie nichts richtig. Das Gefühl hab ich beim CGI-Modul schon lange. Und heute wurde es auch bewiesen. Ich habe mir leider nie die Mühe gemacht in die CPAN-Bugliste vom CGI-Modul zu sehen. Hätte ich&#8217;s man bloß getan.</p>
<p>Insgesamt sind derzeit 115 Fehler gemeldet, einige davon schon seit Jahren. Live erlebt habe ich den folgenden <a href="http://rt.cpan.org/Public/Bug/Display.html?id=31648">Fehler in der url() Methode</a>. Ungequotet wird der Scriptname in eien Regex gesetzt. Unter mod_perl ist dummerweise der Scriptname der gesamte Pfad. Ein <strong>[</strong> im Pfad der URL führt zu einem Laufzeitfehler, wenn man diese Funktion in der Anwendung benutzt.</p>
<p>Ende vom Lied: ich werde mich wohl mal nach einer Alternative umsehen, die sich AUSSCHLIEßLICH um die Entgegenname von Parametern kümmert und noch ein zweites für die Ausgabe von HTTP-Headern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/03/14/schlechte-cpan-module-teil-2-cgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unterschiede von Perl auf verschiedenen Systemen</title>
		<link>http://www.fukurama.org/wordpress/2008/01/28/unterschiede-von-perl-auf-verschiedenen-systemen/</link>
		<comments>http://www.fukurama.org/wordpress/2008/01/28/unterschiede-von-perl-auf-verschiedenen-systemen/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 19:38:29 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl::Kinky]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=123</guid>
		<description><![CDATA[Bei den CPAN-Tests für das Fukurama::Class Modul sind mir zwei Dinge aufgefallen, die auf unterschiedlichen Systemen unterschiedlich von Perl behandelt werden: 1. Zahlenüberläufe werden unterschiedlich markiert. Ich kenne inf, Solaris z.B. benutzt aber Infinity und einige andere hatten noch ein Inf am Start (großgeschrieben). Das fällt nie auf, auer man behandelt genau diese Überläufe. 2. [...]]]></description>
			<content:encoded><![CDATA[<p>Bei den CPAN-Tests für das Fukurama::Class Modul sind mir zwei Dinge aufgefallen, die auf unterschiedlichen Systemen unterschiedlich von Perl behandelt werden:</p>
<p>1. Zahlenüberläufe werden unterschiedlich markiert. Ich kenne <strong>inf</strong>, Solaris z.B. benutzt aber <strong>Infinity</strong> und einige andere hatten noch ein <strong>Inf</strong> am Start (großgeschrieben). Das fällt nie auf, auer man behandelt genau diese Überläufe.</p>
<p>2. Klassennamen können nicht immer als Parameter übergeben werden. Ich hatte im Test ein <strong>$obj->param(My::Class)</strong> verwendet. Das schlug aber komplett fehl. Ich musste es als String übergeben ala <strong>$obj->param(&#8216;My::Class&#8217;)</strong>. Nicht weiter tragisch, sofern man es denn weiß. PS: Für __PACKAGE__ gilt das natürlich auch.</p>
<p><ins datetime="2008-03-23T18:30:00+00:00">Soeben ist ein <a href="http://www.nntp.perl.org/group/perl.cpan.testers/2008/03/msg1206096.html">CPAN-Tester mit einer Windows-Gurke</a> über meine Tests gelaufen. Ich weiß, daß in Visual-Basic z.B. die Boolische Werte in der Landessprache geschrieben werden können. Wie z.B. &#8220;true&#8221;, &#8220;wahr&#8221; oder &#8220;vrai&#8221;. Bei Perl haben sie sich auch Mühe gegeben: <strong>-1.#IND</strong> für NaN und <strong>1.#INF</strong> für Inf. Toll!</p>
<p>In dem Modul erzwinge ich jetzt einen Überlauf und suche mir halt die Systemeigenen Werte. Hmpfrl!</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/01/28/unterschiede-von-perl-auf-verschiedenen-systemen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Perl-Schnittstellen in alle Welt</title>
		<link>http://www.fukurama.org/wordpress/2008/01/28/perl-schnittstellen-in-alle-welt/</link>
		<comments>http://www.fukurama.org/wordpress/2008/01/28/perl-schnittstellen-in-alle-welt/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 18:04:07 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl::Kinky]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=128</guid>
		<description><![CDATA[Aufgrund meiner Recherche über PerlXS &#038; co. bin ich im CPAN über das Modul Inline gestolpert. Ich hab es zwar noch nicht genutzt, aber wenn es so funktioniert wie beschrieben, könnte man theoretisch eine Anwendung aus vielen Teilen zusammensetzen, in auch noch in verschiedenen Sprachen geschrieben wurden. Das hat meiner Meinung nach einen Vorteil, vorausgesetzt [...]]]></description>
			<content:encoded><![CDATA[<p>Aufgrund meiner Recherche über PerlXS &#038; co. bin ich im CPAN über das Modul <a href="http://search.cpan.org/~ingy/Inline/Inline.pod">Inline</a> gestolpert. Ich hab es zwar noch nicht genutzt, aber wenn es so funktioniert wie beschrieben, könnte man theoretisch eine Anwendung aus vielen Teilen zusammensetzen, in auch noch in verschiedenen Sprachen geschrieben wurden.</p>
<p>Das hat meiner Meinung nach einen Vorteil, vorausgesetzt man setzt es mit Bedacht ein: Jeder Programmteil kann in der Sprache geschrieben werden, die am besten geeignet ist. Da es aber nur wie eine Art Kleber die Programmteile zusammenfügen kann, ist das wohl nicht ganz so einfach. Denn vom Java-Code aus dann über Perl auf C++ Code zuzugreifen könnte eine echte Herausforderung sein. Vor allem, da im Hintergrund ja ständig Konvertierungen laufen dürften.</p>
<p>Ich werd mal ein wenig damit spielen aber ich fürchte, es wird auch in der Perl::Kinky-Ecke verbleiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/01/28/perl-schnittstellen-in-alle-welt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl-Variablen (-Referenzen) Schreibschützen</title>
		<link>http://www.fukurama.org/wordpress/2008/01/21/perl-variablen-referenzen-schreibschutzen/</link>
		<comments>http://www.fukurama.org/wordpress/2008/01/21/perl-variablen-referenzen-schreibschutzen/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 13:27:11 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl::Kinky]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=126</guid>
		<description><![CDATA[Ich bin heute Morgen über ein interessantes CPAN-Perl-Modul gestolpert: Internals. Das bietet die Möglichkeit, einen Hash zu schützen, so dass niemand mehr den Inhalt verändern kann. Die Warnungen am Ende des Modules lassen vermuten, dass man damit direkt in den Perl-Eingeweiden rumwurschtelt. Da ich PerlXS jetzt sowieso angehen will, hab ich mir vorgenommen, das Modul [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin heute Morgen über ein interessantes CPAN-Perl-Modul gestolpert: <a href="http://search.cpan.org/~stbey/Internals/Internals.pm">Internals</a>. Das bietet die Möglichkeit, einen Hash zu schützen, so dass niemand mehr den Inhalt verändern kann.</p>
<p>Die Warnungen am Ende des Modules lassen vermuten, dass man damit direkt in den Perl-Eingeweiden rumwurschtelt. Da ich PerlXS jetzt sowieso angehen will, hab ich mir vorgenommen, das Modul mal auseinander zu nehmen. Mal sehen, was man damit so alles anstellen kann. *Muahahahahhaa Muahahahahahaha!*</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2008/01/21/perl-variablen-referenzen-schreibschutzen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>POD-Kuriositäten und das Releasedatum von Perl6</title>
		<link>http://www.fukurama.org/wordpress/2007/11/21/pod-kuriositaten-und-das-releasedatum-von-perl6/</link>
		<comments>http://www.fukurama.org/wordpress/2007/11/21/pod-kuriositaten-und-das-releasedatum-von-perl6/#comments</comments>
		<pubDate>Wed, 21 Nov 2007 12:43:21 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Perl::Kinky]]></category>

		<guid isPermaLink="false">http://www.fukurama.org/wordpress/?p=109</guid>
		<description><![CDATA[In der POD perldoc perlop gibt es folgenden Kommentar zum while {} continue {} Konstrukt. This usage is vaguely deprecated, which means it just might possibly be removed in some distant future version of Perl, perhaps somewhere around the year 2168. Jetzt wissen wir, wann Perl6 kommt: Weinachten 2168!]]></description>
			<content:encoded><![CDATA[<p>In der POD <b>perldoc perlop</b> gibt es folgenden Kommentar zum <b>while {} continue {}</b> Konstrukt.</p>
<p><code>This usage is vaguely deprecated, which means it just might<br />
possibly be removed in some distant future version of Perl,<br />
perhaps somewhere around the year 2168.</code></p>
<p>Jetzt wissen wir, wann Perl6 kommt: Weinachten 2168!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fukurama.org/wordpress/2007/11/21/pod-kuriositaten-und-das-releasedatum-von-perl6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

