首页 > 解决方案 > perl 将数字替换为字母,用于 for

问题描述

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]/[aj]/,但我想用一个替代品。

标签: perlsubstitution

解决方案


您的问题在

s#$n[$_]#$h{$&}#g for 0..$#n

您希望$_成为您的输入(以便s###对其应用),但也$n[$_]可以使用$_from for 循环(0to $#n)。如果您要添加打印,您会注意到$_此循环中的 ' 值是0to $#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'

推荐阅读