in reply to Format of number by template
I like the basic idea, but your right, the implementation could use some work. First off, a couple minor changes to how your doing it now. First off, your API is poorly defined -- the only API you seem to have is "change symbol '#' on digits of number", but your code will change #, X, or x. You should either document that, or remove it. Consider that a template of '#XJ42-##', plus a number of 100, will format to 01J42-00, not 1XJ42-00. Also, there are some innefficencies that you could get around easily. You can accumulate results with $res = $symbol . $res, which avoids having to keep around that list. Since $_ is gaurneteed to be one character long in your test, you don't need the ^...$ anchors. Also, you should use eq, rather then regex matches, when you can get away with it, in general, as they are much faster. Replace /^([Xx]|#)$/ with (($_ eq '#') || ($_ eq 'X') || ($_ eq 'x')) (or just ($_ eq '#'), if you decided that X isn't neccessary). Even ignoring that point, is there a reason you wrote [Xx]|#, rather then [Xx#]?
Most importantly, you could avoid most of the work by using a s///e to do your matching and substution (the /e modifier means the right hand side is an expression, not a double-quoted string (e for execute). See perlop, under "regex quote-like operators".
$_=reverse $form; s =~ s/#/pop @num || 0/e; return reverse $_;
Hm. On an alternate route, you should be able to convert them to s?printf-style format strings.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Format of number by template
by nite_man (Deacon) on Feb 12, 2003 at 13:36 UTC |