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。
我正在尝试将 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。