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 => a
、1 => b
等的散列应该是一个数组):
perl -pe '@a="a".."j"; s#([1-9])#$a[-1]#g'
或者,根本不需要数组(我会让你决定你是否觉得它更容易阅读或更难阅读;我个人觉得很好),
perl -pe 's/([1-9])/chr(ord("a")+-1)/ge'
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 => a
、1 => b
等的散列应该是一个数组):
perl -pe '@a="a".."j"; s#([1-9])#$a[-1]#g'
或者,根本不需要数组(我会让你决定你是否觉得它更容易阅读或更难阅读;我个人觉得很好),
perl -pe 's/([1-9])/chr(ord("a")+-1)/ge'