Warum ist '0' in Perl falsch?

8

Zuerst komme ich aus C, Java, Python-Hintergrund. Vor kurzem habe ich begonnen, Perl für meinen neuen Job zu lernen, und ich wurde neugierig, dass '0' (0-String) falsch ist.

Ich habe gelesen, dass dieses spezielle Verhalten der Grund ist, warum Perl <> operator zum Lesen von Dateien haben musste, so dass es sich mehr wie ein Designfehler für mich anfühlt. Ich weiß aber auch, dass Perl eine ausgereifte Sprache ist und ich vermute, dass dieses Verhalten seinen Nutzen hat, sonst wäre es schon vor langer Zeit behoben worden.

Also, in welchen Fällen wäre '0' = false nützlich?

    
GoldenD 09.01.2013, 01:25
quelle

6 Antworten

9

Perl hat keine explizite Typisierung, und seine Interpretation des Typs ist stark kontextabhängig. Zum Beispiel:

%Vor%

ergibt 5.

andererseits ...

%Vor%

ergibt 3.

und ...

%Vor%

ergibt b23a

Also ist "0" (string) "keine Zeichenfolge oder eine Zahl oder ein Bool, bis Sie es verwenden, und dann kann es eines dieser Dinge sein, bestimmt durch seine Verwendung. Der Typ wird erst festgelegt, wenn Sie versuchen zu arbeiten. Dann bewertet Perl den Kontext, um Ihre Absicht zu verfolgen und handelt entsprechend. Dies ist ein Feature, und warum gibt es viele Möglichkeiten, Dinge in Perl zu tun. Es kann natürlich zu einer Menge verwirrenden Code führen, ist aber hervorragend für 1-Liner, Obfuscation und Perl Golf.

    
foundry 09.01.2013, 01:49
quelle
11

Wenn Sie gelesen haben, dass es etwas mit <> zu tun hat, lesen Sie schlechte Quellen; Ich kann mir nicht vorstellen, wo diese Behauptung herkommen würde.

'0' ist falsch, weil fast überall Perl nicht zwischen Zahlen unterscheidet, die in numerischer Form und in String-Form gespeichert sind; Dies würde in Booleschen Tests gegen diesen Strich laufen.

In Sprachen (Python, Javascript?), wo '0' wahr ist, finde ich es seltsam, dass '' falsch ist; Warum mache ich eine Ausnahme für eine Zeichenfolge, aber nicht für die andere?

    
ysth 09.01.2013 01:48
quelle
7

Perl stiehlt erbt Features aus einer Reihe anderer Sprachen, einschließlich C, awk, Bourne shell und einer Reihe anderer Sprachen.

In C ist jeder 0-Wert falsch, und jeder Wert ungleich Null ist wahr. Perl verwendet nur die gleiche Semantik.

Die Tatsache, dass Perl mehr Dinge hat, die im skalaren oder booleschen Kontext als C verwendet werden können, insbesondere Strings, bedeutet, dass Perl multiple falsche Werte hat.

Die Ganzzahl 0 false macht Sinn für C-Programmierer. Es macht auch Sinn, die leere Zeichenfolge "" false zu machen. Da Perl denselben Skalar entweder als Zahl oder als String behandeln kann, war die Zeichenfolge "0" false fast unvermeidlich.

Zum Beispiel:

%Vor%

Wenn Perl von Grund auf neu entworfen wurde, ohne so viele Features aus anderen Sprachen auszuleihen, könnte eine stärkere Unterscheidung zwischen Strings und Zahlen vornehmen, anstatt sie als Skalare zu gruppieren. Bei einer solchen hypothetischen Perl-ähnlichen Sprache wäre möglicherweise die leere Zeichenfolge und die Zahl 0 falsch, aber die Zeichenfolge "0" wäre wahr - und Sie müssten eine explizite Konvertierung von der Zahl% co_de konvertieren % in die Zeichenfolge 0 .

Aber Perl ist so wie es ist.

    
Keith Thompson 09.01.2013 01:48
quelle
7

Das interne Speicherformat sollte im Idealfall in Perl keine Rolle spielen. Null ist Null ist Null, egal ob es in einem IV, UV, NV, PV, etc gespeichert ist.

Tatsächlich kann Perl das Format, in dem die Werte gespeichert sind, auf eine Weise ändern, die Sie überraschen könnte. Wenn die Zeichenfolge 0 wahr ist, würde der folgende Ausdruck "true" ausgeben:

%Vor%     
ikegami 09.01.2013 01:56
quelle
2

Perl hat eine Anzahl von Werten, die als "falsch" betrachtet werden: undef , Null, die Zeichenkette "0" , die leere Zeichenkette, ein spezieller boolescher Wert, der abhängig vom Kontext in die leere Zeichenkette oder die leere Liste morpht. und Objekte, die für booleschen Kontext überladen sind.

Die meisten davon (undef, null, leere Zeichenfolge, der spezielle Wert, Objekte) sind eigentlich ziemlich nützlich. Die Zeichenfolge "0" ist false stammt aus der Art und Weise, wie Perl Skalare und Falschheit implementiert: Ein Skalar enthält sowohl einen String-Teil als auch einen numerischen Teil. Um zu ermitteln, ob ein Wert falsch ist, wird der String-Abschnitt zuerst konsultiert. Warum ist das notwendig?

%Vor%

Ohne dies würde die Zahl Null ihre Falschheit verlieren, sobald Sie sie dort verwenden, wo eine Zeichenfolge benötigt wird. Auf der anderen Seite erlaubt dies "0 but true" , eine wahre Zeichenkette, die die Zahl Null ist, und "0E0" , was wissenschaftliche Notation für Null ist, aber auch wahr ergibt.

    
amon 09.01.2013 01:51
quelle
1

0 entspricht in C auch false - es entspricht in einigen "alten" Programmiersprachen false, vielleicht aufgrund der inhärenten Bindung von 0 an Binär- und Schaltkreise, wobei 0 "keine Ladung" bedeuten kann.

Auf jeden Fall erben neuere Sprachen oft Verhaltensweisen und Interpretationen von Sprachen. Die binäre Bedeutung von 0 ist "keine Ladung" oder "es ist falsch, dass es eine Ladung gibt" wurde lange Zeit von jeder höheren Programmiersprache abstrahiert, aber der Leckerbissen der Semantik bleibt selbst durch die modernsten Programmiersprachen erhalten.

Auch - nach meinem besten Wissen hat das nichts mit & lt; & gt; - Wo hast du das gelesen?

    
PinkElephantsOnParade 09.01.2013 16:06
quelle

Tags und Links