Ваша проблема находится в пределах
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'