Два perl-скрипта, использующие разные разделители входных записей, работают вместе, чтобы преобразовать файл LaTeX во что-то, что легко найти для понятных человеку фраз и предложений.Конечно, они могут быть объединены одним сценарием оболочки.Но мне любопытно, могут ли они быть включены в один скрипт perl.
Причина этих скриптов: было бы непросто найти, например, «два три» внутри short.tex.Но после преобразования grep 'two three' вернет первый абзац.
Для любого файла LaTeX (здесь, short.tex) сценарии вызываются следующим образом.
cat short.tex | try1.pl | try2.pl
try1.pl работает над абзацами.Избавляется от комментариев LaTeX.Он гарантирует, что каждое слово отделено от его соседей одним пробелом, чтобы между словами не скрывались скрытые вкладки, каналы и т. Д.Результирующий абзац занимает одну строку, состоящую из видимых символов, разделенных одиночными пробелами, а в конце - последовательность по крайней мере из двух символов новой строки.
try2.pl удаляет весь файл.Это гарантирует, что параграфы отделены друг от друга ровно двумя новыми строками.И это гарантирует, что последняя строка файла является нетривиальной, содержащей видимые символы.
Можно ли элегантно объединить две операции, подобные этим, которые зависят от разных разделителей входных записей, в один сценарий perl, скажем, big.pl?Например, может ли работа try1.pl и try2.pl быть выполнена двумя функциями или сегментами в квадратных скобках внутри более крупного скрипта?
Кстати, есть ли ключевое слово stackoverflow для «разделителя входных записей»?
try1.pl:
#!/usr/bin/perl
use strict;
use warnings;
use 5.18.2;
local $/ = ""; # input record separator: loop through one paragraph at a time. position marker $ comes only at end of paragraph.
while (<>) {
s/[\x25].*\n/ /g; # remove all LaTeX comments. They start with %
s/[\t\f\r ]+/ /g; # collapse each "run" of whitespace to one single space
s/^\s*\n/\n/g; # any line that looks blank is converted to a pure newline;
s/(.)\n/$1/g; # Any line that does not look blank is joined to the subsequent line
print;
print "\n\n"; # make sure each paragraph is separated from its fellows by newlines
}
try2.pl:
#!/usr/bin/perl
use strict;
use warnings;
use 5.18.2;
local $/ = undef; # input record separator: entire text or file is a single record.
while (<>) {
s/[\n][\n]+/\n\n/g; # exactly 2 blank lines separate paragraphs. Like cat -s
s/[\n]+$/\n/; # last line is nontrivial; no blank line at the end
print;
}
short.tex:
\paragraph{One}
% comment
two % also 2
three % or 3
% comment
% comment
% comment
% comment
% comment
% comment
So they said%
that they had done it.
% comment
% comment
% comment
Fleas.
% comment
% comment
После преобразования:
\paragraph{One} two three
So they said that they had done it.
Fleas.