Perl 将所有数字替换为字母
abc4xyz5u
至
abcdxyzeu
我尝试了这个,但它不起作用:
echo 'abc4xyz5u' | perl -pe'@n=1..9;@a=a..j;@h{@n}=@a;s#$n[$_]#$h{$&}#g for 0..$#n'
我知道 y/[1-9]/[a-j]/,但我想使用替代品。
最佳答案
您的问题在
之内s#$n[$_]#$h{$&}#g for 0..$#n
您期望 $_
作为您的输入(以便将 s###
应用到其上),但也 $n[$_]
使用 for 循环中的 $_
(0
到 $#n
)。如果您要添加打印,您会注意到此循环中 $_
的值是 0
到 $#n
,而不是比你的输入。
您可以采取以下措施来修复它:
$r=$_; $r=~s#$n[$_]#$h{$&}#g for 0..$#n; $_=$r
但这比实际情况要复杂得多。我会这样做:
s#([1-9])#$h{$1}#g
或者,不使用 %h
(因为,让我们面对现实吧,带有 0 => a
、1 => b
等的哈希.应该是一个数组):
perl -pe '@a="a".."j"; s#([1-9])#$a[$1-1]#g'
或者,根本不需要数组(我会让你决定你是否发现它更容易或更难阅读;我个人对此很满意),
perl -pe 's/([1-9])/chr(ord("a")+$1-1)/ge'
关于perl 将数字替换为字母,与 for 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58022670/