Нечетное поведение подстановки в подстановке perl файла rtf - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь использовать модуль perl "RTF :: Writer" для строк текста, которые должны быть смесью форматов. Это оказывается сложнее, чем я ожидал. Я сейчас пытаюсь выполнить тест с:

$rtf->paragraph( \'\b', "Name: $name, le\cf1 ng\cf0 th $len" );

, но это пишет:

{\pard
\b
Name: my_name, le\'061 ng\'060 th 7
\par}

, где \'061 должно быть \cf1 и \'060 должно быть \cf0.

Затем я попытался исправить это с помощью perl 1-строки:

perl -pi -e "s/\'06/\cf/g"

, но это ухудшило ситуацию, Я не знаю, что "\^F" представляет в vi, но это то, что он показывает.

Не имеет значения, избежал ли я обратной косой черты или нет.

Может кто-нибудь объяснить это поведение, и что с этим делать?

Кто-нибудь может подсказать, как получить RTF :: Writer для создания файла с самого начала?

Спасибо

1 Ответ

1 голос
/ 01 мая 2020

\ - это специальный символ в строковых литералах в двойных кавычках. Если вам нужна строка, содержащая \, вам нужно использовать \\ в литерале. Чтобы создать строку \cf1, вам нужно использовать "\\cf1". ("\cf" означает Ctrl-F, то есть байт 06.)

В качестве альтернативы, \ является специальным, только если за ним следует \ или разделитель в строковых литералах в одинарных кавычках. Таким образом, строка \cf1 также может быть создана из '\cf1'.

Обе выдают нужную вам строку, но не выдают нужный вам документ. Это потому, что есть вторая проблема.

Когда вы передаете строку в RTF :: Writer, ожидается, что это будет текст для рендеринга. Но вы передаете строку, которую хотите включить, как есть в итоговом документе. Вам нужно передать ссылку на строку, если вы хотите предоставить необработанный RTF. \'...', \"..." и \$str все дают ссылку на строку.

Исправлено:

use RTF::Writer qw( );

my $name = "my_name";

my $rtf = RTF::Writer->new_to_file("greetings.rtf");
$rtf->prolog( 'title' => "Greetings, hyoomon" );
$rtf->paragraph( \'\b', "Name: $name, le", \'\cf1', "ng", \'\cf0', "th".length($name));
$rtf->close;

Вывод из вызова на paragraph:

{\pard
\b
Name: my_name, le\cf1
ng\cf0
th7
\par}

Обратите внимание, что я не использовал следующее, потому что это будет ошибка внедрения кода :

$rtf->paragraph(\("\\b Name: $name, le\\cf1 ng\\cf0 th".length($name)));

Не передавайте текст, такой как содержимое $name с использованием \...; используйте это только для необработанного RTF.

...