2013-02-14 14 views
9

Ich stelle fest, dass looks_like_number nicht einfach true/false zurückgibt, wie ich angenommen habe, sondern tatsächlich ein Byte zurückgibt, das den Typ der Zahl angibt, die die Perl-Internals im Skalar gespeichert haben. Zum Beispiel:Scalar :: Util looks_like_number zurückkehrende Zahlentypen

perl -e'use Scalar::Util qw/looks_like_number/; for (qw/ 1 3 10 34.23 545435.234 2343.0 234 -1423 1sddf -865178652134876152348761253487613254 sdf 24363456345636534563567253765734655 8764325hjkh435 iuh340874 &*^*& 786521948761324876132497821347816.23452345 -8762135487126387432.12435154243 0 nan inf/) { print $_, ": ", looks_like_number($_), "\n" } ' 
1: 1 
3: 1 
10: 1 
34.23: 5 
545435.234: 5 
2343.0: 5 
234: 1 
-1423: 9 
1sddf: 0 
-865178652134876152348761253487613254: 10 
sdf: 0 
24363456345636534563567253765734655: 2 
8764325hjkh435: 0 
iuh340874: 0 
&*^*&: 0 
786521948761324876132497821347816.23452345: 6 
-8762135487126387432.12435154243: 14 
0: 1 
nan: 36 
inf: 20 

Es ist nicht wirklich in Scalar dokumentiert :: Util, dass ich nur eine Erwähnung davon perlapi des looks_like_number Wert zurückgibt, die auch in der Dokumentation nicht finden kann. Auf einen Blick scheint es zu sein:

  • & 1 = Numerisch
  • & 2 = 64 bit
  • & 4 = Gleitkomma
  • & 8 = Negativ
  • & 16 = unendlich
  • & 32 = keine Nummer

Sind diese Masken tragbar und sicher im Code zu verwenden?

+0

Für was es sich lohnt 'looks_like_number()' scheint die gleichen Werte für Ihre Beispieleingaben auf allen stabilen Perls seit 5.8, mindestens auf Linux 32-Bit. Natürlich ist die umsichtige Antwort auf Ihre Frage immer noch "Nein". – pilcrow

+0

Ab Scalar :: Util 1.39 wurde dies geändert, und 'looks_like_number' gibt immer' PL_yes' oder 'PL_no' (d. H.' !! 1' oder '!! 0') zurück. – tobyink

Antwort

5

Nein, wenn sie nicht dokumentiert sind, können sie sich ändern. Und "numeric" und "64 bit" sind nicht wirklich angemessene Beschreibungen dieser Flags. Was sie tun tun scheint nicht besonders nützlich in Perl-Code zu wissen.

Welches Problem versuchen Sie zu lösen?

+0

Ja, real oder groß ist wahrscheinlich besser, aus meiner vagen Erinnerung an C. Ich versuche, Eingabe als int zu validieren, und wahrscheinlich vorzeitige Optimierung zu tun, anstatt nur gegen/it zu laufen/^ \ d + $/ – Oesor

+0

http: // forums.xkcd.com/viewtopic.php?f=7&t=100204#p3270122 - vielleicht meinst du '[0-9] +' (oder benutze den '/ a' Modifikator in 5.14+) – ysth

+0

Und deshalb habe ich mir das angesehen eine Nicht-Re-Methode an erster Stelle: P. – Oesor

1

Verlassen Sie sich nicht auf undokumentiertes Verhalten, der Rückgabewert ist an Perls Interna gebunden, er kann sich (und wird wahrscheinlich) in Zukunft ändern; Je nachdem, auf welcher Plattform/Architektur Ihr Skript läuft, kann es sogar anders sein!

Wenn Sie auf NaN, unendlich oder negative Null testen möchten, siehe this question.

Verwandte Themen