Перл заменяет числа на алфавит, используется с - PullRequest
1 голос
/ 20 сентября 2019

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] /, но я хочу использовать замену.

Ответы [ 2 ]

3 голосов
/ 20 сентября 2019

Ваша проблема находится в пределах

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

Вы ожидаете, что $_ будет вашим вводом (так что к нему применяется s###), но также $n[$_] будет использовать $_ издля цикла (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'
0 голосов
/ 20 сентября 2019

Я бы посоветовал написать его как скрипт perl.Упомянутый вами вкладыш немного сложен для понимания.

use strict;                                                            
use warnings;

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

my $input = $ARGV[0];

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

print $input;

Выполнить -

perl substitute.pl abc4xyz5u

Вывод -

abcdxyzeu

Я выполняю поиск числа в строке и заменяю его алфавитом в той же позиции (начало массива remenber начинается с индекса 0 и, следовательно, 'позиция -1')в массиве «алфавиты»

...