format#
Declare a picture-based report template for use by write.
format is a declaration, not an executable statement. It binds a named picture — a block of fixed-column output lines with embedded field markers — to the symbol table, where write later looks it up by name. Pictures do not interpolate variables; each picture line is followed by an argument line whose expressions fill the fields in order. format is a legacy feature of Perl; upstream notes its use is limited and points at perlform for the full field grammar.
Synopsis#
format NAME =
FORMLIST
.
format = # declares the "STDOUT" format
FORMLIST
.
A FORMLIST is a sequence of lines, each one of three kinds: a comment (# in column 1), a picture line, or an argument line supplying values for the picture line immediately above it. A single . in column 1 terminates the declaration.
What you get back#
format is a declaration and has no runtime value. It installs the compiled picture into the current package’s format table under NAME (or STDOUT if NAME is omitted). It is not called; it is triggered indirectly by write.
The pieces of a picture#
Each picture line mixes literal text with field markers. A field begins with @ (regular field) or ^ (special field, used for fill mode and for blankable numeric fields) and extends through pad characters that set both the width and the justification:
<— left-justified text>— right-justified text|— centered text#— right-justified numeric; a leading0pads with zeroes;.places the decimal point...— at the tail of a text field, renders three dots when the value was truncated@*— variable-width field that emits a multi-line scalar verbatim^*— variable-width field that emits the next line of a scalar and consumes that portion of the source variable
Two suppression tokens may appear anywhere on a picture line and are not part of any field:
~— if every field on this line is empty, the line is suppressed entirely; the~itself renders as a space otherwise~~— like~, and additionally repeats the line until every field on it is exhausted (every source scalar is empty or everyshift-style expression returns undef)
perlform.pod gives the full grammar of picture lines including fill mode, multi-line fields, overflow (####), and locale-dependent decimal points.
The argument line#
The line immediately below a picture line is the argument line: a comma-separated list of expressions, one per field, evaluated in list context before the picture is rendered. A single list-returning expression may fill multiple fields. The argument list may be broken across lines if and only if the first token on the first line is an opening brace:
format Report =
@<<<<<<<< @>>>>>>
{ $name,
$score }
.
Globals that control write#
Output through format is driven entirely by per-filehandle globals. Each is attached to the currently selected filehandle; changing them for another handle requires a select dance (see below):
$~— name of the current format used for each record (defaults to the filehandle’s own name)$^— name of the current top-of-page format (defaults to the filehandle’s name with_TOPappended)$=— page length in lines (default 60)$-— lines remaining on the current page;writedecrements it and triggers the top-of-page format when it reaches zero$%— current page number, incremented automatically$:— characters that fill mode (^) may break on (default" \n-")$^L— string emitted before each top-of-page except the first (default"\f")
Under use English these are $FORMAT_NAME, $FORMAT_TOP_NAME, $FORMAT_LINES_PER_PAGE, $FORMAT_LINES_LEFT, $FORMAT_PAGE_NUMBER, $FORMAT_LINE_BREAK_CHARACTERS, and $FORMAT_FORMFEED.
Because these are per-handle, setting them for a handle other than the currently selected one needs select:
my $ofh = select $fh;
$~ = 'Report';
$^ = 'Report_TOP';
select $ofh;
Top-of-form#
When write decrements $- to zero, it emits $^L (except on the very first page), resets $- to $=, increments $%, and invokes the format named by $^. The default top-of-page format name is the filehandle’s name with _TOP appended, so declaring STDOUT_TOP suffices for writes through STDOUT.
Examples#
A minimal report with a header:
format STDOUT_TOP =
Inventory
Name Qty Price
----------------------------
.
format STDOUT =
@<<<<<<<<<<<<< @>> @##.##
$name, $qty, $price
.
for my $row (@rows) {
($name, $qty, $price) = @$row;
write;
}
Switching formats for a non-selected handle:
open my $fh, '>', 'report.txt' or die $!;
my $ofh = select $fh;
$~ = 'Report';
$^ = 'Report_TOP';
select $ofh;
write $fh;
Fill mode with ~~ to drain a multi-line scalar one line at a time:
format STDOUT =
Note: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$note
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$note
.
The ^ fields consume $note as they render; the ~~ line repeats until $note is empty.
Edge cases#
Lexical visibility: a format sees a
myvariable only when declared inside that variable’s scope. A top-level format cannot seemyvariables declared inside a subroutine; use package globals or declare the format inside the sub.Quoted pictures: if you build a picture with
evalfrom a double-quoted string,@namelooks like an array interpolation. Escape it or use single quotes around the template.A lone
.is the terminator: a picture whose literal text would begin with.in column 1 must indent that line. This also bites format code sent through naive mail transports that cut at.on a line of its own.Numeric overflow: a
#-field narrower than the formatted number renders as####rather than truncating silently.Locale decimal point: if
use localewas in effect when the format was declared,LC_NUMERICpicks the decimal character. Togglinguse localeatwritetime does not change the picture.Control characters inside a fixed-width text field are replaced by spaces to preserve column alignment.
Mixing
printandwrite: legal on the same handle, but$-only tracks lines emitted bywrite. Adjust$-manually if interleavedprintoutput consumes page lines you care about.No footer mechanism: there is no
$FORMAT_BOTTOM_NAME. Footers are done by hand — test$-before eachwriteand emit the footer yourself when it reaches a threshold.
Differences from upstream#
Fully compatible with upstream Perl 5.42.
See also#
write— render one record through the current format into the selected filehandle; the only way a declared format produces outputselect— change which filehandle is current, required when setting$~,$^,$=,$-,$%,$:, or$^Lfor a handle other thanSTDOUT$~— current format name$^— current top-of-page format name$=— page length$-— lines left on the current page$%— current page number$:— fill-mode break charactersperlform.pod— full picture-line grammar, fill-mode rules,formline/$^Ainternals, and worked report examples