http://qs321.pair.com?node_id=83731


in reply to Re: Tacking a function on to STDOUT?
in thread Tacking a function on to STDOUT?

Certain perl built-ins can be overriden and others can't. For a discussion on this, see this node. The following code shows one way to override a built-in:
use warnings; use subs 'die'; #our own print, but it doesn't override the built-in sub print { CORE::print scalar(localtime),": "; CORE::print(@_); } #our own die, will override the built-in sub die { print "goodbye cruel world\n";} #calls our custom print #notice you have to use &print() notation &print( "hello world\n"); #calls built in print print "goodbye\n"; #calls our overriden die die "hello";
This outputs:
Mon May 28 10:41:21 2001: hello world goodbye goodbye cruel world
You could also use CORE::GLOBAL to override the built-in everywhere (for example if you wanted to add your own custom die handler to catch die in other modules). Here's a package that exports it's own die sub that will be used everywhere -- use with caution!
#mydie.pm #a package to export a global die, overriding the perl builtin #reference perldoc perlsub package mydie; require Exporter; use vars qw/@ISA @EXPORT/; @ISA = 'Exporter'; @EXPORT_OK = qw/die/; sub import { my $pkg = shift; return unless @_; my $sym = shift; my $where = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0)); $pkg->export($where, $sym, @_); Exporter::import($pkg,@_); } sub die { print "goodbye cruel world\n"; CORE::die $_[0]; }
and here's an example that uses the globally overriden die:
#!/usr/local/bin/perl use warnings; use strict; use mydie qw(die); print "hello world\n"; #calls the die exported by mydie.pm die "argh!!!";
prints:
hello world goodbye cruel world argh!!! at mydie.pm line 20.