aboutsummaryrefslogtreecommitdiffstats
path: root/doc/user/prg_perl
blob: e1fa0d6cc621d16b309e04a68a57e48b41af0f77 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
@Section
   @Title { Notes on Perl and Pod }
   @Tag { prg_perl }
@Begin
@PP
The Perl programming language
programs. @RawIndex { programs }
programs.perl @SubIndex { Perl problems }
perl.programs @Index { Perl problems (programs) }
@FootNote { My thanks to Mark Summerfield for help with Perl and Pod. }
is quite a difficult one for the @Code { prg2lout } program to deal with,
and our boast that programs can be included with `absolutely no
modifications' is not quite true for Perl.
@PP
Here is the complete list of problem areas.  In most cases their
effect is to get the formatting wrong over a short region, which is not
perhaps so disastrous; and it should be easy to modify your Perl program
without changing its meaning, to work around these problems.  After all,
in Perl there is always more than one way to do it.
@NumberedList

@LI {
@I Here-documents such as
@ID @Verbatim {
<<"EOF"
These lines will be read as though
enclosed in double quotes
EOF
}
will be handled correctly only if the string appearing immediately after
the @Perl { << } operator (that is, the string used to terminate the
here-document) is one of @Perl { EOF }, @Perl { EOT }, @Perl { END },
and the empty string, all optionally enclosed in quotes of any of the
three kinds.  If this condition is not met, then the here-document will
be treated as Perl program text.  If the condition is met, there is still
another problem:  the @Perl { << } symbol and everything after it on the
same line will be treated (incorrectly) as a string.  The worst consequence
of this is that stacked here-documents will not be printed properly.
}

@LI {
When @Code { prg2lout } is scanning the program text looking for the
beginning of a lexical unit, it may come upon a @Code "/" character,
and this @I initial @Code "/" (not subsequent ones in the same lexical
unit) it finds difficult to interpret, since it may be the beginning
of a regular expression, to be formatted like a string, or it may be a
complete lexical unit denoting division.  The program chooses the regular
expression (or equivalently, string) interpretation if the @Code "/"
character is immediately preceded by @Code { "q" }, @Code { "qq" },
@Code { "qx" }, @Code { "qw" }, @Code { "qr" }, @Code { "m" },
@Code { "s" }, @Code { "y" }, or @Code { "tr" }.  It also chooses the
regular expression interpretation if the @Code "/" character appears
at the start of a line, or if it is immediately preceded by zero, one,
or two space or tab characters, which are themselves immediately preceded
by a complete lexical unit which is one of @Code { "(" }, @Code { "=" },
@Code { "=~" }, @Code { "!~" }, @Code { "split" }, @Code { "if" },
@Code { "and" }, @Code { "&&" }, @Code { "or" }, @Code { "||" },
@Code { "not" }, @Code { "!" }, @Code { "unless" },
@Code { "for" }, @Code { "foreach" }, and @Code { "while" }.  Otherwise
it chooses the division interpretation.  In the rare cases where this
rule fails, you can force @Code { prg2lout } to choose the regular expression
interpretation by placing an @Code { m } in front of the initial @Code "/"
(this does not change the meaning of the program), and you can force the
division interpretation by placing at least three spaces before the
@Code "/" character.
}

@LI {
Substitution expressions, even such lexically complex ones as
@Perl { s{{@D}}[{@I}] }, are handled correctly.  However,
@Code { prg2lout } does not understand that the letters @Code "gimosx"
in any combination appearing immediately after a substitution
expression are part of it; it treats them as the start of a new lexical
unit.  This new unit will usually be taken to be an identifier, which
is harmless enough, but occasionally it is taken to be something
else.  For example, in
@ID @Code @Verbatim { s///s; }
the trailing @Code "s" will be mistaken for the start of a new
substitution expression, with @Code ";" delimiting the first
pattern.  This particular example can be fixed by inserting a
space before the semicolon.
}

@EndList
Further work may eliminate some of these problems.
@PP
The Pod language is used by Perl programmers for creating documentation,
programs. @RawIndex { programs }
programs.pod @SubIndex { Pod problems }
pod.programs @Index { Pod problems (programs) }
and may be found within Perl programs or standing alone.  Lout supports
both arrangements without any special action by the user.  At the
beginning of the @Code perl setup line, the following line has been placed:
@ID @Code "@SysInclude { pod }"
Thus, asking for Perl always gives you Pod as well.  If you are using
your own setup files for both languages, it is probably better to
break this connection by deleting this line from your copy of the
@Code perl setup file and placing
@ID @OneRow @Code {
"@Include { mypod }"
"@Include { myperl }"
}
at the start of your document in the usual way.
@PP
Because Pod is a documentation language rather than a programming
language, the setup file options listed in Section {@NumberOf cpsetup}
do not really apply.  So for Pod only these have been discarded and replaced
by a completely different set of options, controlling such things as
the size of headings and the gaps between list items, which you can
find documented in the @Code { pod } setup file.
@PP
If you ask for line numbers on a Pod program, or on a Perl program that
contains Pod, any text blocks in the Pod that would otherwise have
appeared as filled paragraphs will come out with the line breaks in
the source respected, and lines numbered accordingly.  Because
@Code "prg2lout" attaches line numbers before Lout breaks paragraphs,
it is not possible to number the lines after paragraph breaking.
@PP
Owing to problems behind the scenes, if a Pod inclusion in a Perl
program has unbalanced braces, @Code "prg2lout" is forced to insert
braces into the Pod text to make them balance.  It will insert a
left brace directly before any unbalanced right brace, and it will
insert right braces at the end of the Pod inclusion to balance any
preceding unbalanced left braces.  It will tell you if it has to do
this.  This problem does not afflict Pod when used as a separate language.
@End @Section