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

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) 所有这些需要做的就是删除字符,但现在我正在尝试将数字转换为文本,并删除逗号和括号 我可能不太了解我现在

我在寻求一些帮助,试图将以下日志转换为纯文本

这是一个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)

所有这些需要做的就是删除字符,但现在我正在尝试将数字转换为文本,并删除逗号和括号

我可能不太了解我现在的工作方式,因为我对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转换百分比编码字符

  • 未指定是否有任何内容可以跟随带有
    char(…)
    s的部分,以及可能的内容。如果最后一个
    字符(…)
    之后还有更多字符,请将拆分调整为
    @部分
    ,或进行澄清

  • 在带有
    char(…)
    s的部分中,只需要数字,regex在使用什么

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

  • ,教程

  • ,快速入门介绍

  • ,语法的完整说明

  • ,一个快速参考(其部分本身很有用)


    • 对于一个合理的班轮来说,这里有太多的事情要做。此外,脚本更容易在以后进行调整

      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转换百分比编码字符

      • 未指定是否有任何内容可以跟随带有
        char(…)
        s的部分,以及可能的内容。如果最后一个
        字符(…)
        之后还有更多字符,请将拆分调整为
        @部分
        ,或进行澄清

      • 在带有
        char(…)
        s的部分中,只需要数字,regex在使用什么

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

      • ,教程

      • ,快速入门介绍

      • ,语法的完整说明

      • ,一个快速参考(其部分本身很有用)


        • 这将按您的要求执行。它分两个阶段执行解码:首先使用
          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已经消失了,因为它是我一直在玩的东西。主要的一点是