perl 将数字替换为字母,与 for 一起使用

perl substitute numbers to alphabet,used with 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]/[a-j]/,但我想用一个替代品。

我建议将其正确编写为 perl 脚本。 你说的那一行有点难懂。

use strict;                                                            
use warnings;

my @alphabets = ("a".."z");

my $input = $ARGV[0];

$input =~ s/(\d)/$alphabets[ - 1]/g;

print $input;

运行 -

perl substitute.pl abc4xyz5u

输出 -

abcdxyzeu

我正在搜索字符串中的数字并将其替换为 'alphabets' 数组[=13 中相同位置的字母表(记住数组从 0 索引开始,因此 'position -1') =]

您的问题在

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{}#g

或者,不使用 %h(因为,让我们面对现实吧,带有 0 => a1 => b 等的散列应该是一个数组):

perl -pe '@a="a".."j"; s#([1-9])#$a[-1]#g'

或者,根本不需要数组(我会让你决定你是否觉得它更容易阅读或更难阅读;我个人觉得很好),

perl -pe 's/([1-9])/chr(ord("a")+-1)/ge'