Perl:将字符串转换为C字符串文字

Perl:将字符串转换为C字符串文字,c,perl,C,Perl,如何使用Perl将任意字符串转换为有效的、人类可读的字符串 C字符串文字,即可以放入C源代码并被C编译器理解的东西 仅需要核心模块的解决方案可获得额外积分 #!/usr/bin/perl use strict; use warnings; my $str = get_some_string(); # Read string from file, database, network etc my $cstr = ???($str); print "const char *str = $c

如何使用Perl将任意字符串转换为有效的、人类可读的字符串 C字符串文字,即可以放入C源代码并被C编译器理解的东西

仅需要核心模块的解决方案可获得额外积分

#!/usr/bin/perl

use strict;
use warnings;

my $str = get_some_string();    # Read string from file, database, network etc
my $cstr = ???($str);
print "const char *str = $cstr;" # This has to form valid C statement
示例输出:

const char *str = "Hello, \"C\" string\n";

这就行了

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("\110\145\154\154\157\054\040\167\157\162\154\144\012");
}
正则表达式匹配除a-z a-z 0-9之外的每个字符,并将其转换为八进制值。您可以轻松地将\W替换为任何更具体的匹配项,如[^a-zA-Z0-9,\.-]匹配除a-z a-z 0-9以外的所有项或[\x00-\x1f]匹配每个小于30=空格的ASCII码

较短的解决办法是:

$str =~ s/(["'`])/\\$1/g;

但是,这个只能用\前缀转义引号。所有其他可能导致故障的字符都可以通过,无需更换。

Perl似乎提供了用于此目的的函数:

cstringSTR

返回STR的双引号转义版本,可以 在C源代码中用作字符串


C将不改变地接受该字符串。如果您想要更多的内容,那么必须准确地指定字符串中可能出现的内容以及显示方式。我的意思是在Perl中生成该字符串。我忘了在问题正文中提到它,尽管它在标题中被提到并被标记-请参阅我的编辑。打印qq有什么问题{const char*str=Hello,world\\n;\n};?这就是说,你似乎没有一个程序,你不能去工作,你需要帮助。你的问题也太模糊了,我怀疑你是否能得到一个有用的答案,直到你自己清楚你真正需要的是什么,好吧,你试过什么不起作用?您的字符串总是7位ASCII码吗?get_字符串中的内容是否会像您最初说的那样包含转义符\110\145\154\154\157\054\040\167\157\162\154\144\012?我很惊讶你写了一个像这样的垃圾问题,并以11KC的声誉无法击败现成的图书馆解决方案-我不太乐意看到在生产代码中使用它。为了一个实用函数,它添加了大量代码。模块的描述是这样的:B模块提供了一些类,这些类允许Perl程序深入其内部。它是用于实现Perl编译器后端的模块。编译器的使用不需要了解此模块:有关用户可见部分,请参阅O模块。对于那些想编写新编译器后端的人来说,B模块很有用。我同意它是外部模块。但是B是作为XS实现的核心模块。我的简单基准测试表明,性能影响可以忽略不计。它还提供了perlstring函数,该函数可以生成Perl字符串文本。也许,但如果您发现它恰好包含一个cstring,您是否愿意使用XML::Twig::XPath?这不是B模块的用途
$str =~ s/(["'`])/\\$1/g;
print B::cstring(q/hi "C" string/)
# prints "hi \"C\" string"