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:
Or to create an$str = formline <<'END', 1,2,3; @<<< @||| @>>> END print "Wow, I just stored `$^A' in the accumulator!\n";
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);