Footers
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]
[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.
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 "Functions") 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.
Accessing Formatting Internals
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!\n";
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) . "~~\n", $long_text);