While $^
($FORMAT_TOP_NAME
) contains the name of the current
header format, there is no corresponding mechanism to do the same
thing automatically for a footer. Not knowing how big a format is
going to be until you evaluate it is one of the major problems. It's
on the TODO list.[2]
Here's one strategy: if you have a fixed-size footer, you can
get footers by checking $-
($FORMAT_LINES_LEFT
) before each
write
and then print the footer yourself if
necessary.
Here's another strategy; open a pipe to yourself, using
open(MESELF, "|-")
(see the open
entry in Chapter 29) and always
write
to MESELF
instead of
STDOUT
. Have your child process postprocess its
STDIN
to rearrange headers and footers however you
like. Not very convenient, but doable.
For low-level access to the internal formatting
mechanism, you may use the built-in formline
operator and access $^A
(the
$ACCUMULATOR
variable) directly. (Formats
essentially compile into a sequence of calls to
formline
.) For example:
$str = formline <<'END', 1,2,3; @<<< @||| @>>> END print "Wow, I just stored `$^A' in the accumulator! ";
Or to create an swrite
subroutine that is
to write
as sprintf
is to
printf
, do this:
use Carp; sub swrite { croak "usage: swrite PICTURE ARGS" unless @_; my $format = shift; $^A = ""; formline($format, @_); return $^A; } $string = swrite(<<'END', 1, 2, 3); Check me out @<<< @||| @>>> END print $string;
If you were using the FileHandle
module,
you could use formline
as follows to wrap a block
of text at column 72:
use FileHandle; STDOUT->formline("^" . ("<" x 72) . "~~ ", $long_text);
[2] That doesn't guarantee we'll ever do it, of course. Formats are somewhat passé in this age of WWW, Unicode, XML, XSLT, and whatever the next few things after that are.