Perl - 将整数转换为文本Char(1,2,3,4,5,6)

时间:2018-01-29 01:44:24

标签: perl

我正在尝试将以下日志转换为纯文本之后的一些帮助。

这是一个网址,因此可能有%20 ='空格'和其他但我正在尝试转换的主要部分是char(1,2,3,4,5,6)到文本。

以下是我要转换的示例。

  

选择%20char(45,120,49,45,81,45),炭(45,120,50,45,81,45),炭(45,120,51,45,81,45)

到目前为止,我尝试添加到char(in here)并使用chr($2)

转换为以下内容
perl -pe "s/(char())/chr($2)/ge" 

所有这一切设法都是删除char但现在我正在尝试将数字转换为文本并删除逗号和括号。

我可能会因为我对perl相当陌生而离开。

  

perl -pe" s / 删除 / 字以将其更改为 / ge"

     

" s /(char(这里的内容))/ chr($ 2)/ ge"

输出尝试实现

  

选择-x1-Q - , - x2-Q - , - x3-Q-

     

或者

     

选择%20-X1-Q - , - X2-Q - , - X 3-Q -

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

在这里做一个合理的单线太多了。此外,稍后将更容易调整脚本

use warnings;
use strict;
use feature 'say';

use URI::Escape 'uri_unescape';

my $string = q{select%20} 
    . q{char(45,120,49,45,81,45),char(45,120,50,45,81,45),} 
    . q{char(45,120,51,45,81,45)}; 

my $new_string = uri_unescape($string);  # convert %20 and such

my @parts = $new_string =~ /(.*?)(char.*)/;

$parts[1] = join ',', map { chr( (/([0-9]+)/)[0] ) } split /,/, $parts[1];

$new_string = join '', @parts;
say $new_string;

打印

select -x1-Q-,-x2-Q-,-x3-Q-

评论

  • 模块URI::Escape用于转换百分比编码字符,符合RFC 3986

  • 未指明是否有任何内容可以跟随char(...) s的部分,以及可能是什么。如果在最后char(...)之后可以有更多内容将分拆调整为@parts,或澄清

  • char(...) s的部分中,只需要数字,map中的正则表达式使用

如果你打算使用正则表达式,你应该阅读它。见

答案 1 :(得分:0)

好吧,这将是一个混乱的"单线"。假设您的文本位于名为$text的变量中。

$text =~ s{char\( ( (?: (?:\d+,)* \d+ )? ) \)}{
    my @arr = split /,/, $1;
    my $temp = join('', map { chr($_) } @arr);
    $temp =~ s/^|$/"/g;
    $temp
    }xeg;

正则表达式匹配char(,后跟逗号分隔的数字序列列表,后跟)。我们捕获捕获组$1中的数字。在替换中,我们在逗号上分割$1(因为chr仅适用于一个字符,而不是它们的整个列表)。然后我们在每个数字上映射chr并将结果连接成一个字符串。下一行只是在字符串的开头和结尾加上引号(可能是你想要引用的输出),然后返回新的字符串。

输入:

select%20char(45,120,49,45,81,45),char(45,120,50,45,81,45),char(45,120,51,45,81,45)

输出:

select%20"-x1-Q-","-x2-Q-","-x3-Q-"

如果您想要替换%转义序列,我建议您单独执行此操作。试图将两个替换整合到一个语句中会变得非常毛茸茸。

答案 2 :(得分:-1)

这会按照你的要求行事。它分两个阶段执行解码:首先使用chr hex $1解码URI编码,然后将每个char()函数转换为与其十进制参数的字符等价物相对应的字符串

use strict;
use warnings 'all';
use feature 'say';

my $s = 'select%20char(45,120,49,45,81,45),char(45,120,50,45,81,45),char(45,120,51,45,81,45)';

$s =~ s/%(\d+)/ chr hex $1 /eg;

$s =~ s{ char \s* \( ( [^()]+ ) \) }{ join '', map chr, $1 =~ /\d+/g }xge;

say $s;

输出

select -x1-Q-,-x2-Q-,-x3-Q-