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

时间:2016-05-06 10:32:00

标签: 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 = $cstr;" # This has to form valid C statement

示例输出:

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

3 个答案:

答案 0 :(得分:3)

#!/usr/bin/perl

use strict;
use warnings;

my $str = q/Hello, "C" string/ . "\n";
$str =~ s/(\W)/sprintf('\\%03o',ord($1))/ge;
print "const char *str = \"$str\";"

RegEx匹配除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;

但是那个只能用\前缀来转义引号。所有其他可能导致麻烦的字符都可以通过而无需替换。

答案 1 :(得分:3)

似乎Perl为此目的提供了B::cstring函数:

  

<强>:字符串(STR)

     

返回双引号包含的STR转义版本   在C源代码中用作字符串。

print B::cstring(q/hi "C" string/)
# prints "hi \"C\" string"

答案 2 :(得分:1)

这样可以正常工作

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("\110\145\154\154\157\054\040\167\157\162\154\144\012");
}

输出

Hello, world