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.


Warning: Unless otherwise stated, code is untested. Do not use without understanding. Code is posted in the hopes it is useful, but without warranty. All copyrights are relinquished into the public domain unless otherwise stated. I am not an angel. I am capable of error, and err on a fairly regular basis. If I made a mistake, please let me know (such as by replying to this node).

Replies are listed 'Best First'.
Re: Re: Format of number by template
by nite_man (Deacon) on Feb 12, 2003 at 13:36 UTC
    Thank you for your corrections.
    Yes, my function changes #, X and x because a template can be like thit 'DSF-###-####' and like that - 'XXX-XXXXXX-XXXX'<code>. <br>If number is <code>2345 and template is 'Ro-XXX-XXXXX-XXX'<code> result has to be <code>'Ro-000-00002-345'.
    I used regular expression for compactness of code.Thanks for interenting idea about /e modifier. I haven't known it. (I don't know a lot of things yet I think ;)) ).
    Michael