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.
In reply to Re: Format of number by template
by theorbtwo
in thread Format of number by template
by nite_man
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |