I've been working on implementing $token->literal() support for PPI::Token::Number subclasses. This method takes a string representing a number and tries to parse it like Perl does. Thus:
'-.00_1' -> -0.001
Egads, Perl has a lot of numeric formats with a lot of special parsing! Tonight figuring out where Perl allows underscores in numbers is driving me a little batty. I've got PPI's tests working with valid underscore placement, but I need to write some tests for invalid underscore placement. For example:
1_000 # valid
1__000 # valid, but warns
100_ # valid, but warns
1_000.000_001 # valid
1_.000 # valid, but warns
1._000 # valid, but warns
0xdead_beef # valid
0_xdeadbeef # syntax error
0_755 # syntax error
0b1010_1010 # valid
0b_10 # valid, but warns
0_b10 # syntax error
1e1_0 # valid
1e_10 # valid, but warns
1e_-10 # valid, but warns
6_0.6_0.6_0 # valid
looks_like_number() (Score:2)
Re: (Score:1)
Or from Scalar::Util [perl.org].
Re: (Score:1)
Much appreciated! I was not aware of that function. In this particular case, PPI is designed to be more lenient than Perl (it must be round-trip-safe even on invalid syntax) so we'll stick to our custom tokenizing. That said, I'll probably look deeply at looks_like_number to see if I can find inconsistencies in our tokenizer.
Re: (Score:1)
Instead, I've discovered scan_num() in toke.c. That's what I want to emulate (leniently).
5.6 (Score:1)
Underscore (Score:2)
Re: (Score:1)