[Melbourne-pm] overloading 'print'

Jacinta Richardson jarich at perltraining.com.au
Fri Mar 17 03:03:05 PST 2006

Mathew Robertson wrote:

>>The short answer is that you can't.  Print isn't one of Perl's overloadable
>>functions.  (The reason is that the syntax is special cased. You cannot make a
>>user function with the same prototype.)
> ok - I'm guessing this is because print can take a filehandle as the
> first argument ?

That's the one!

> ok - thats a bit complicated.  Any ideas on the implementation of the
> sub-class of IO::File ?

Nope.  Upon further consideration it might not help anyway for what you're
trying to do, as I think you'd have to do $fh->print....

> Currently if I want to print out a string translated (to say Chinese), I
> would code something like:
>   use Locale::MakePhrase;
>   my $mp = Locale::MakePhrase->new(language => 'zn_ch', ....);
>   .....
>   print $mp->translate("Some text to translate");
> thus to use the module within your application, would require the
> application code to modified to support the L::M syntax.  What I would
> like to do is extend L::M to override 'print' so that the code becomes
> much simpler:
>   use Locale::MakePhrase qw(print);
>   Locale::MakePhrase->new(language  => 'zn_ch',...);
>   ...
>   print "Some text to translate";
> Thus with two simple lines at the top of the application, you
> automagically get all of the translation facilities.  If you choose to
> use a different translation tool, you simply change those two lines -
> thus saving you from having to re-code your app for the new API.

Personally I think that's a little bit evil.  What if I actually want to print?
 Surely it's not that hard to write an editor substitution for replacing "print"
with "print $mp->translate" where desired.  But sure, as an academic exercise,
how could you do this?  Perhaps the following might help.

use Filter::Handle qw/subs/;

Filter \*STDOUT, sub {
            print $mp->translate $_;


All the best,


   ("`-''-/").___..--''"`-._          |  Jacinta Richardson         |
    `6_ 6  )   `-.  (     ).`-.__.`)  |  Perl Training Australia    |
    (_Y_.)'  ._   )  `._ `. ``-..-'   |      +61 3 9354 6001        |
  _..`--'_..-_/  /--'_.' ,'           | contact at perltraining.com.au |
 (il),-''  (li),'  ((!.-'             |   www.perltraining.com.au   |

More information about the Melbourne-pm mailing list