我想写一个Perl单行来解码一行编码为十六进制数字的ASCII字符(例如,行48 54 54 50
应解码为HTTP
)。我想出了这个:
perl -nE 'say map(chr, map { qq/0x$_/ } split)'
打印一个空行。我做错了什么,你会怎么写呢?
答案 0 :(得分:6)
这有效:
echo '48 54 54 50' | perl -nE 'say map{chr(hex)} split'
我假设您要从STDIN提供数据。
答案 1 :(得分:6)
这是你的qq/0x$_/
伎俩不起作用。 chr
期望一个数字作为参数,但得到字符串文字"0x48"
。使用hex
功能将48
转换为十进制数,例如datageist中的his answer。
这对我有用:
echo '48 54 54 50' | perl -nE 'say map(chr, map { hex } split)'
答案 2 :(得分: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'
以下是一些示例如果正常写的话会是什么样子。如果你想弄清楚其他人做了什么,一定要看perldoc perlrun
。
perl -0x20 -pe'$_=chr hex$_'
这是一个相当直接的。它可能是这里最好的例子,也是最短的例子。它假装空格用于分隔线条,因此在循环内部只有一个字母可以处理。
# perl -0x20 -pe'$_=chr hex$_'
$/ = " "; # -0 ( input separator )
while( <> ){
$_ = chr hex $_;
} continue {
print $_;
}
perl -0apple'$_=chr hex$_' -0x20
这个有一些命令行选项,它们没有做任何有用的事情。
-0
选项存在,以便-l
将输出分隔符设置为空字符串。
这实际上是输出分隔符的默认值。-p
选项,其中一个就足够了。-a
选项会设置@F
数组,但我们实际上并未使用它。基本上我使用-a
-l
和第二个-p
,以便选项拼写 apple 。否则这个与最后一个例子相同。
echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_'
# perl -0apple'$_=chr hex$_' -0x20
$/ = ""; # -0 ( input separator )
$\ = $/; # -l ( output separator )
$/ = " "; # -0x20 ( input separator )
while( <> ){
@F = split " ", $_; # -a ( unused )
$_ = chr hex $_;
} continue {
print $_;
}
perl -lanE'say map{chr hex}@F'
我认为我已拼写 apple ,我不妨拼写 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;
}
答案 3 :(得分:3)
玩perlgolf?
-ple y/0-9A-Fa-f//cd;$_=pack"H*",$_
-ple $_=pack"H*",$_,join"",split
-nE say map chr hex,split
-naE say map chr hex,@F