Formats in PERL
Output record formats for use with the write-operator may declared as
follows:
format NAME =
FORMLIST
.
If name is omitted, format STDOUT is defined. FORMLIST consists
of a sequence of lines, each of which may be of one of three
types:
- A comment.
- A "picture" line giving the format for one output line.
- An argument line supplying values to plug into a picture line.
Picture lines are printed exactly as they look, except for certain
fields that substitute values into the line. Each picture field
starts with either @ or ^. The @ field (not to be confused with
the array marker @) is the normal case; ^ fields are used
to do rudimentary multi-line text block filling. The length of
the field is supplied by padding out the field with multiple
<, >, or | characters to specify, respectively, left
justification, right justification, or centering. As an alternate
form of right justification, you may also use # characters (with
an optional .) to specify a numeric field. (Use of ^ instead of
@ causes the field to be blanked if undefined.) If any of the
values supplied for these fields contains a newline, only the text
up to the newline is printed. The special field @* can be used
for printing multi-line values. It should appear by itself on a line.
The values are specified on the following line, in the same
order as the picture fields. The values should be separated by commas.
Picture fields that begin with ^ rather than @ are treated
specially. The value supplied must be a scalar variable name which
contains a text string. Perl puts as much text as it can into
the field, and then chops off the front of the string so that the
next time the variable is referenced, more of the text can be printed.
Normally you would use a sequence of fields in a vertical stack to
print out a block of text. If you like, you can end the final field
with ..., which will appear in the output if the text was too long
to appear in its entirety. You can change which characters are
legal to break on by changing the variable $:
to a list of the desired characters.
Since use of ^ fields can produce variable length records if the
text to be formatted is short, you can suppress blank lines by putting
the tilde (~) character anywhere in the line. (Normally you should
put it in the front if possible, for visibility.) The tilde will be
translated to a space upon output. If you put a second tilde contiguous
to the first, the line will be repeated until all the fields on the
line are exhausted. (If you use a field of the @ variety, the
expression you supply had better not give the same value every time forever!)
For example,
# a report on the /etc/passwd file
format STDOUT_TOP =
Passwd File
Name Login Office Uid Gid Home
------------------------------------------------------------
.
format STDOUT =
@<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<
$name, $login, $office,$uid,$gid, $home
.
# a report from a bug report form
format STDOUT_TOP =
Bug Reports
@<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>
$system, $%, $date
------------------------------------------------------------
.
format STDOUT =
Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$subject
Index: @<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<
$index, $description
Priority: @<<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<
$priority, $date, $description
From: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<
$from, $description
Assigned to: @<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<
$programmer, $description
~ ^<<<<<<<<<<<<<<<<<<<<<<
$description
~ ^<<<<<<<<<<<<<<<<<<<<<<
$description
~ ^<<<<<<<<<<<<<<<<<<<<<<
$description
~ ^<<<<<<<<<<<<<<<<<<<<<<
$description
~ ^<<<<<<<<<<<<<<<<<< ...
$description
.
It is possible to intermix prints with writes on the same
output channel, but you'll have to handle $-
(lines left on the page) yourself.
If you are printing lots of fields that are usually blank, you
should consider using the reset
operator between records. Not only is it more efficient, but it can
prevent the bug of adding another field and forgetting to zero it.
Click here to go back to the Perl index
|