2013-02-14 4 views
9

Ho notato che looks_like_number non restituisce semplicemente true/false come presumibilmente, ma restituisce effettivamente un byte che indica il tipo di numero che gli interni di perl sono memorizzati nello scalare. Per esempio:Scalare :: Util looks_like_number restituire i tipi di numero

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 

In realtà non è documentato in Scalar :: Util che posso trovare, solo una menzione di esso restituire valore looks_like_number di perlapi, che non è anche nella documentazione. In sintesi, sembra essere:

  • & 1 = numerico
  • & 2 = 64 bit
  • & 4 = virgola mobile
  • & 8 = negativo
  • & 16 = infinito
  • & 32 = non un numero

Queste maschere sono portatili e sicure da utilizzare nel codice?

+0

Per quello che vale 'looks_like_number()' sembra restituire gli stessi valori per gli input di esempio su tutti i perls stabili dal 5.8, almeno su Linux a 32 bit. Certo, la risposta prudente alla tua domanda è ancora "no". – pilcrow

+0

A partire da Scalar :: Util 1.39, questo è stato modificato, e 'looks_like_number' restituisce sempre' PL_yes' o 'PL_no' (cioè' !! 1' o '!! 0'). – tobyink

risposta

5

No, se non sono documentati, sono soggetti a modifiche. E "numerico" e "64 bit" non sono descrizioni veramente adeguate di quelle bandiere. Cosa fanno do do non sembra particolarmente utile per conoscere il codice Perl.

Che problema stai cercando di risolvere?

+0

Sì, vero o grande è probabilmente meglio, dal mio vago ricordo di C. Sto provando a convalidare l'input come un int e probabilmente facendo un'ottimizzazione prematura invece di eseguirlo semplicemente con/^ \ d + $/ – Oesor

+0

http: // forums.xkcd.com/viewtopic.php?f=7&t=100204#p3270122 - forse intendi '[0-9] +' (o usa il modificatore '/ a' in 5.14+) – ysth

+0

Ed è per questo che stavo guardando un metodo non-re in primo luogo: P. – Oesor

1

Non fare affidamento su comportamenti non documentati, il valore di ritorno è legato agli interni di Perl, può (e probabilmente lo farà) cambiare in futuro; potrebbe anche essere diverso a seconda della piattaforma/architettura su cui viene eseguito lo script!

Se si desidera verificare NaN, infinito o zero negativo, vedere this question.

Problemi correlati