如何使用Perl单行解码以十六进制编码的ASCII字符串?

zou*_*oul 5 perl

我想编写一个Perl单行代码来解码一行编码为十六进制数字的ASCII字符(例如,该行48 54 54 50应解码为HTTP).我想出了这个:

perl -nE 'say map(chr, map { qq/0x$_/ } split)'
Run Code Online (Sandbox Code Playgroud)

它打印一个空行.我做错了什么,你会怎么写?

dat*_*ist 6

这有效:

echo '48 54 54 50' | perl -nE 'say map{chr(hex)} split'
Run Code Online (Sandbox Code Playgroud)

我假设你想从STDIN提供数据.


Han*_*s W 6

这是你的qq/0x$_/伎俩不起作用.chr期望一个数字作为参数,但得到字符串文字"0x48".使用该hex函数转换48为十进制数,就像datageist他的答案中所做的那样.

这对我有用:

echo '48 54 54 50' | perl -nE 'say map(chr, map { hex } split)'
Run Code Online (Sandbox Code Playgroud)

  • 嗯......看起来可以这样写:...... | perl -nE'表示地图chr,地图十六进制,拆分'使用更少的标点字符(这很重要:) (2认同)

Bra*_*ert 6

和Perl TIMTOWTDI一样.

我想我会提交几个选项,并展示如果它们正常写的话会是什么样子.如果您想了解有关命令行选项的更多信息,那么这perldoc perlrun是一个有用的资源.


这些都输出相同的东西.除了其中一些不会在最后打印换行符.

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_'
echo '48 54 54 50' | perl -0x20 -ne'print chr hex$_'
echo '48 54 54 50' | perl -0777 -anE'say map chr,map hex,@F'
echo '48 54 54 50' | perl -0777 -anE'say map{chr hex$_}@F'
echo '48 54 54 50' | perl -0apple'$_=chr hex$_' -0x20
echo '48 54 54 50' | perl -apple'$_=join"",map{chr hex}@F'
echo '48 54 54 50' | perl -lanE'say map{chr hex}@F'
Run Code Online (Sandbox Code Playgroud)

以下是一些示例如果正常编写的话会是什么样子.如果你想弄清楚其他人做了什么,一定要看看perldoc perlrun.


perl -0x20 -pe'$_=chr hex$_'
Run Code Online (Sandbox Code Playgroud)

这是一个相当直接的.它可能是这里最好的例子,也是最短的例子.它假装空格用于分隔线,因此在循环内部只有一个字母可以处理.

# perl -0x20 -pe'$_=chr hex$_'
$/ = " ";  # -0 ( input separator )
while( <> ){
  $_ = chr hex $_;
} continue {
  print $_;
}
Run Code Online (Sandbox Code Playgroud)
perl -0apple'$_=chr hex$_' -0x20
Run Code Online (Sandbox Code Playgroud)

这个有一些命令行选项,没有做任何有用的事情.

  • 第一个-0选项是-l将输出分隔符设置为空字符串.这实际上是输出分隔符的默认值.
  • 有两个-p选项可供选择.
  • -a选项设置@F数组,但我们实际上并没有使用它.

基本上我用-a -l了一秒钟,-p以便选项拼写苹果.否则这个与最后一个例子相同.

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_'
Run Code Online (Sandbox Code Playgroud)
# perl -0apple'$_=chr hex$_' -0x20
$/ = "";  # -0 ( input separator )
$\ = $/;  # -l ( output separator )
$/ = " "; # -0x20 ( input separator )
while( <> ){
  @F = split " ", $_; # -a ( unused )
  $_ = chr hex $_;
} continue {
  print $_;
}
Run Code Online (Sandbox Code Playgroud)
perl -lanE'say map{chr hex}@F'
Run Code Online (Sandbox Code Playgroud)

我想我已经拼了苹果,我不妨拼写lanE.

  • -l没有用,因为我们已经在使用了say.
  • 使用-E而不是-e我们可以使用say.
# perl -lanE'say map{chr hex}@F'
$\ = $/; # -l ( output separator set to "\n" )
while( <> ){
  @F = split " ", $_; # -a
  say map { chr hex $_ } @F;
}
Run Code Online (Sandbox Code Playgroud)