我想编写一个Perl单行代码来解码一行编码为十六进制数字的ASCII字符(例如,该行48 54 54 50应解码为HTTP).我想出了这个:
perl -nE 'say map(chr, map { qq/0x$_/ } split)'
Run Code Online (Sandbox Code Playgroud)
它打印一个空行.我做错了什么,你会怎么写?
这有效:
echo '48 54 54 50' | perl -nE 'say map{chr(hex)} split'
Run Code Online (Sandbox Code Playgroud)
我假设你想从STDIN提供数据.
这是你的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 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)