8.1.3. Discussion
Here's an example input file:
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) \
$(TEXINFOS) $(INFOS) $(MANS) $(DATA)
DEP_DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) \
$(TEXINFOS) $(INFO_DEPS) $(MANS) $(DATA) \
$(EXTRA_DIST)
You'd like to process that file a record at a time with the escaped
newlines ignored. The first record would then be the first two lines,
the second record the next three lines, etc.
Here's how the algorithm works. The while loop
reads lines one at a time. The substitution operator
s/// tries to remove a trailing backslash. If the
substitution fails, we've found a line without a backslash at the
end. Otherwise, read another record, concatenate it onto the
accumulating $line variable, and use
redo to jump back to just inside the opening brace
of the while loop. This lands us back on the
chomp.
A frequent problem with files intended to be in this format arises
when unnoticed spaces or tabs follow the backslash before the
newline. The substitution that found continuation lines would be more
forgiving if written this way:
if ($line =~ s/\\\s*$//) {
# as before
}
Unfortunately, even if your program is forgiving, surely others will
not be. Remember to be liberal in what you accept, but conservative
in what you produce.