Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

(Re: I don't use printf enough) Interpolation.pm

by bart (Canon)
on Oct 23, 2003 at 00:42 UTC ( #301435=note: print w/ replies, xml ) Need Help??


in reply to I don't use printf enough

While we're at it, may I point you towards the module Interpolation too? MJD (who originally wrote and released it, it is now maintained by another person) originally thought of it as nothing but a joke, but it's actually quite a handy way to insert often used function calls of one parameter into doublequotish strings.

The way it does it, is by tieing (most commonly) a hash to a function, making use of perl's remarkable feature that it always treats the index as code, and executes it before looking up the associated hash value. This function can simply pass its parameter along, allowing you simply insert a calculated scalar.

I see basically two basic ways to use it. The first route, is using the official import interface, like this:

# "Official" import mechanism use Interpolation commify => sub { local $_ = scalar reverse shift; s/(\d+\.)|(\d\d\d)(?=\d)/$1 || "$2,"/ge; return scalar reverse $_; }; $a = 12345.21; $b = 1357.98; print "$a*$b with commas inserted looks like '$commify{$a*$b}'.\n";
which produces:
12345.21*1357.98 with commas inserted looks like '16,764,548.2758'.
Oh, yes. That does indeed perform a multiplication.

Do you see the relationship between the parameter for use, the string "commify", and the global hash %commify? You do?!? Well I don't, that' why I like the tie approach better, as you can tie any hash, a global, a variable from another package, or a lexical. Incidently, this snippet does basically the same thing as the previous one:

# Non-obfuscated form, using tie(): use Interpolation; my %commify; tie %commify, Interpolation => sub { local $_ = scalar reverse shift; s/(\d+\.)|(\d\d\d)(?=\d)/$1 || "$2,"/ge; return scalar reverse $_; }; $a = 12345.21; $b = 1357.98; print "$a*$b with commas inserted looks like '$commify{$a*$b}'.\n";
It's lots less obscured how it does what it does, so scoping issues etc. will be much more on familiar terrain.


Comment on (Re: I don't use printf enough) Interpolation.pm
Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://301435]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (8)
As of 2014-11-28 20:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (200 votes), past polls