rtf 文件的 perl 替换中的奇怪替换行为

Odd substitution behaviour in perl substitution of rtf file

我正在尝试将 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-liner 来解决这个问题:

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

但这让事情变得更糟,我不知道 "\^F" 在 vi​​ 中代表什么,但这就是它所显示的。

是否转义反斜杠并不重要。

任何人都可以解释这种行为,以及如何处理它?

任何人都可以建议如何让 RTF::Writer 从一开始就根据需要创建文件吗?

谢谢

\ 是双引号字符串文字中的特殊字符。如果你想要一个包含 \ 的字符串,你需要在文字中使用 \。要创建字符串 \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}

请注意,我没有使用以下内容,因为它会是 code injection bug:

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

不要使用 \... 传递诸如 $name 内容之类的文本;仅将其用于原始 RTF。