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]
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.
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 ...
Get Programming Perl, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.