<?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>meier-online &#187; Fallen</title>
	<atom:link href="http://meier-online.com/tag/fallen/feed/" rel="self" type="application/rss+xml" />
	<link>http://meier-online.com</link>
	<description>Der Blog von Karsten Meier</description>
	<lastBuildDate>Sun, 09 Oct 2011 13:27:57 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Eins plus Zwei</title>
		<link>http://meier-online.com/2010/12/one-plus_two/</link>
		<comments>http://meier-online.com/2010/12/one-plus_two/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 17:42:11 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Fallen]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Typumwandlung]]></category>

		<guid isPermaLink="false">http://meier-online.com/?p=726</guid>
		<description><![CDATA[Eine Überraschung in Ruby. Selbst bei so etwas einfachen wie der Addition von Zahlen gibt es manchmal Überraschungen. Doch der Reihe nach. Wenn wir den interaktiven Ruby-Interpreter &#8220;irb&#8221; starten, können wir in als einfachen Rechner nutzen. irb&#62; 1+2 =&#62; 3 So weit so praktisch. In der Programmierpraxis liegen Zahlen häufig als String vor, z.B in [...]]]></description>
			<content:encoded><![CDATA[<h3>Eine Überraschung in Ruby.</h3>
<p>Selbst bei so etwas einfachen wie der Addition von Zahlen gibt es manchmal Überraschungen. Doch der Reihe nach. Wenn wir den interaktiven Ruby-Interpreter &#8220;irb&#8221; starten, können wir in als einfachen Rechner nutzen.</p>
<pre>irb&gt; 1+2
=&gt; 3</pre>
<p>So weit so praktisch. In der Programmierpraxis liegen Zahlen häufig als String vor, z.B in Textdateien oder als Formularparameter in Webseiten. Probieren wir also folgendes:</p>
<pre>&gt; input="1"
&gt; input+2
TypeError: can't convert Fixnum into String</pre>
<p>Richtig, wir müssen in Ruby erst explizit den String in einen Integer umwandeln. Dafür gibt es die Methode to_i</p>
<pre>&gt; input.to_i+2
=&gt; 3</pre>
<p>Ok, damit es etwas besser aussieht, fügen wir ein Leerzeichen ein</p>
<pre>&gt; input.to_i +2
=&gt; 1</pre>
<p>Huch? Was war das? Ist unsere Variable vielleicht überschrieben worden? Probieren wir es mal direkt:</p>
<pre>&gt;"1".to_i+2
=&gt; 3</pre>
<pre>&gt;"1".to_i +2
=&gt; 1</pre>
<p>Bei einen Leerzeichen vor dem Pluszeichen und keinem Leerzeichen nach dem Pluszeichen gibt es ein anderes Ergebnis. Wo kann dieses Ergebnis herkommen? Probieren wir andere Zahlen:</p>
<pre>&gt;"2".to_i +2
=&gt; 0</pre>
<p>Es wird immer rätselhafter!</p>
<pre>
&gt; "1".to_i +1
ArgumentError: illegal radix 1
</pre>
<p>Aha, es gibt eine Spur. Vielleicht schaut wir uns die Dokumentation der Methode &#8220;to_i&#8221;genauer an:</p>
<p><a title="Dokumentation Ruby String Klasse" href="http://ruby-doc.org/core/classes/String.html#M000787">http://ruby-doc.org/core/classes/String.html#M000787</a></p>
<p>Die Methode to_i hat demnach einen optionalen Parameter Namens &#8220;radix&#8221;. Der String kann als Zahl im Hexadecimal-, Decimal, Octal- oder Binärsystem interpretiert werden.</p>
<p>Weiter steht dort momentan: &#8220;This method *never* raises an exception.&#8221; Also soll die Methode, falls sie auf Grund von unerlaubten Eingaben zu Fehlern führt, immer 0 liefern, und niemals eine Exception erzeugen. Gut, wenn das so exakt dokumentiert ist. Leider ist die Aussage so nicht richtig, denn der ArgumentError ist schließlich auch eine Exception.</p>
<p>Wie hilft uns dies jetzt, das eigenartige Verhalten zu erklären? In Ruby kann man die Klammern auch bei einen Funktionsaufruf weglassen. Offenbar macht unser Rubyinterpreter aus:</p>
<pre>"1".to_i +2</pre>
<pre>"1".to_i( +2 ) =&gt; "1".to_i( 2 ) =&gt; 1</pre>
<p>Der String &#8220;1&#8243; wird als Binärzahl interpretiert, und liefert dann die Zahl 1. Eine Addition findet nicht mehr statt. So lässt sich auch erklären:</p>
<pre>"2".to_i(+2) = 0</pre>
<p>Ruby versucht den String &#8220;2&#8243; als Binärzahl zu interpretieren. Das geht nicht, weil Binärzahlen nur aus 0 und 1 bestehen. Ruby liefert dann wie dokumentiert einfach eine 0 zurück.</p>
<p>Insgesamt bleibt dabei ein ungutes Gefühl: Selbst bei einer einfachen Addition kann durch hinzufügen oder weglassen von Leerzeichen aus einen korrekten Programm ein Falsches werden. Leider der Preis, den man in Ruby  für den Verzicht auf Klammern zahlen muss. In diesen Fall ermöglicht  der optionale Parameter der Methode &#8220;to_i&#8221; diese Mehrdeutigkeiten. Optionale Klammern in Zusammenspiel mit optionalen Parametern sind leider eine gefährliche Kombination.</p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2010/12/one-plus_two/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vergleich von Strings in PHP</title>
		<link>http://meier-online.com/2008/11/vergleich-von-strings-in-php/</link>
		<comments>http://meier-online.com/2008/11/vergleich-von-strings-in-php/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 16:48:00 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Fallen]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Strings]]></category>

		<guid isPermaLink="false">http://meier-online.com/blog/?p=158</guid>
		<description><![CDATA[In meiner Programmiertätigkeit wechsle ich oft zwischen verschiedenen Programmiersprachen. Hat man erstmal Konzepte wie strukturierte und objektorientierte Programmierung verstanden, ist das auch gar nicht so schwierig. Probleme tauchen manchmal aber ausgerechnet bei ganz einfachen Dingen auf. Strings in PHP zu vergleichen ist eigentlich einfach, gibt es doch den &#8220;==&#8221; Operator. Doch es lauert eine Falle: [...]]]></description>
			<content:encoded><![CDATA[<p>In meiner Programmiertätigkeit wechsle ich oft zwischen verschiedenen Programmiersprachen. Hat man erstmal Konzepte wie strukturierte und objektorientierte Programmierung verstanden, ist das auch gar nicht so schwierig. Probleme tauchen manchmal aber ausgerechnet bei ganz einfachen Dingen auf.</p>
<p>Strings in PHP zu vergleichen ist eigentlich einfach, gibt es doch den <span style="font-family: courier new;">&#8220;==&#8221; </span>Operator. Doch es lauert eine Falle: <span id="more-158"></span>Ist eine der beiden Operanden kein String, gibt es eine automatische Umformung. Und die kann auch schon mal anders sein, als man sich das vorstellt.</p>
<p style="margin-bottom: 0cm;">0 == &#8220;hallo&#8221; liefert wahr, weil &#8220;hallo&#8221; in eine Zahl mit dem Wert 0 umgewandelt wird. Brisant wird dies, wenn die 0 Rückgabewert einer Funktion war, die normalerweise einen String liefert, und eine 0 z. B. im Fehlerfall. Wenn der Programmierer nicht darüber nachdenkt, so verhält sich das Programm anders als erwartet, und das ausgerechnet im Fehlerfall, der meist nicht so gut getestet wird.</p>
<p style="margin-bottom: 0cm;">Z.B.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> getCommandFromUser<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$cmd</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;deleteTable&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
deleteDatabaseTables<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="margin-bottom: 0cm;">In PHP gibt es noch den Operator mit drei Gleichheitszeichen, &#8220;<span style="font-family: courier new;">===</span>&#8220;. In PHP testet es zunächst, ob beide Operanden den gleichen Typ haben.</p>
<p>Diesen Operator kann man also in solchen Fällen nehmen. Nun halte ich die Gleichheitszeichen für alles andere als eingängig, die zwei Gleichheitszeichen sind ja eigentlich schon mathematisch fragwürdig. Der === Operator wird ja gerne in Sprachen genommen, wenn man irgendwie noch einen weiteren Vergleichsoperator benötigt, wobei die Semantik in jeder Programmiersprache verschieden ist&#8230;</p>
<p>Eine weitere Möglichkeit sind <span style="font-family: courier new;">strcmp()</span> und <span style="font-family: courier new;">strcasecmp()</span>. Das zweite bietet sich oft an, wenn die Groß/Kleinschreibung ignoriert werden soll. Vorsichtig muss man sein, weil die Funktionen 0 liefern, wenn die Strings gleich sind, in anderen Kontexten ist 0 ja als &#8220;False&#8221; zu sehen. Der Code wird dadurch leider noch unübersichtlicher:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span> <span style="color: #339933;">==</span> <span style="color: #990000;">strcasecmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cmd</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;deleteTable&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2008/11/vergleich-von-strings-in-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

