Perl-将整数转换为文本字符(1,2,3,4,5,6)
我在寻求一些帮助,试图将以下日志转换为纯文本 这是一个URL,因此可能有%20='space'和其他,但我尝试将Perl-将整数转换为文本字符(1,2,3,4,5,6),perl,character-encoding,Perl,Character Encoding,我在寻求一些帮助,试图将以下日志转换为纯文本 这是一个URL,因此可能有%20='space'和其他,但我尝试将字符(1,2,3,4,5,6)转换为文本 下面是我试图转换的示例 选择%20char(45120,49,45,81,45)、char(45120,50,45,81,45)、char(45120,51,45,81,45) 到目前为止,我在尝试添加到char(在这里)以使用chr($2) 所有这些需要做的就是删除字符,但现在我正在尝试将数字转换为文本,并删除逗号和括号 我可能不太了解我现在
字符(1,2,3,4,5,6)
转换为文本
下面是我试图转换的示例
选择%20char(45120,49,45,81,45)、char(45120,50,45,81,45)、char(45120,51,45,81,45)
到目前为止,我在尝试添加到char(在这里)
以使用chr($2)
所有这些需要做的就是删除字符,但现在我正在尝试将数字转换为文本,并删除逗号和括号
我可能不太了解我现在的工作方式,因为我对perl相当陌生
perl-pe“s/word以删除/word以将其更改为/ge”
“s/(char(这里放什么)/chr($2)/ge”
试图实现的输出是
选择-x1-Q-,-x2-Q-,-x3-Q--
或
选择%20-x1-Q-,-x2-Q-,-x3-Q--
谢谢你的帮助好吧,这将是一个混乱的“一行”。假设文本位于名为
$text
的变量中
$text =~ s{char\( ( (?: (?:\d+,)* \d+ )? ) \)}{
my @arr = split /,/, $1;
my $temp = join('', map { chr($_) } @arr);
$temp =~ s/^|$/"/g;
$temp
}xeg;
正则表达式匹配字符(
,后跟逗号分隔的数字序列列表,后跟)
。我们在捕获组$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-"
如果您还想替换
%
转义序列,我建议在单独的一行中进行替换。试图将两个替换整合到一个语句中会变得非常棘手。好吧,这将是一个混乱的“一行”。假设文本位于名为$text
的变量中
$text =~ s{char\( ( (?: (?:\d+,)* \d+ )? ) \)}{
my @arr = split /,/, $1;
my $temp = join('', map { chr($_) } @arr);
$temp =~ s/^|$/"/g;
$temp
}xeg;
正则表达式匹配字符(
,后跟逗号分隔的数字序列列表,后跟)
。我们在捕获组$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-"
如果您还想替换
%
转义序列,我建议在单独的一行中进行替换。试图将两个替换都集成到一个语句中会变得非常棘手。对于一个合理的一行来说,这里有太多的事情要做。此外,脚本更容易在以后进行调整
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-
选择-x1-Q-,-x2-Q-,-x3-Q--
评论
- 模块用于根据RFC 3986转换百分比编码字符
- 未指定是否有任何内容可以跟随带有
s的部分,以及可能的内容。如果最后一个char(…)
之后还有更多字符,请将拆分调整为字符(…)
,或进行澄清@部分
- 在带有
s的部分中,只需要数字,regex在使用什么char(…)
- ,教程
- ,快速入门介绍
- ,语法的完整说明
- ,一个快速参考(其部分本身很有用)
- 对于一个合理的班轮来说,这里有太多的事情要做。此外,脚本更容易在以后进行调整
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-
选择-x1-Q-,-x2-Q-,-x3-Q--
评论
- 模块用于根据RFC 3986转换百分比编码字符
- 未指定是否有任何内容可以跟随带有
s的部分,以及可能的内容。如果最后一个char(…)
之后还有更多字符,请将拆分调整为字符(…)
,或进行澄清@部分
- 在带有
s的部分中,只需要数字,regex在使用什么char(…)
- ,教程
- ,快速入门介绍
- ,语法的完整说明
- ,一个快速参考(其部分本身很有用)
- 这将按您的要求执行。它分两个阶段执行解码:首先使用
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;
输出
这就照你说的做。它分两个阶段执行解码:首先使用
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;
输出
@无论如何,请建议使用其他工具。否则,您的评论的目的就不清楚了。请为您的示例显示所需的输出input@chb如果你有另一种方法,请随意提出。perl已经消失了,因为它是我一直在玩的东西。我试图转换的主要位是char(45120,49,45,81,45),是的,在perl中它是chr(xx),我对URL最了解的%20,所以不要大惊小怪。@chb当然可以,建议使用其他工具。否则,您的评论的目的就不清楚了。请为您的示例显示所需的输出input@chb如果你有另一种方法,请随意提出。perl已经消失了,因为它是我一直在玩的东西。主要的一点是