s/^(name,(\d+).*)/$1,$hash{$2}/;
Во-первых, паренны нумеруются в порядке левой пары, а не правой. Таким образом, $1
- это полная строка, а $2
- это число, а не наоборот.
Во-вторых, вы не хотите использовать /e
здесь. Это приводит к тому, что замена будет оцениваться как код Perl, а не просто строка, что означает, что ,
обрабатывается как оператор запятой , а не просто как текст. В скалярном контексте оператор запятой оценивает оба операнда и возвращает второй, а здесь это не то, что вам нужно. Если бы вы сказали
use warnings;
Perl сказал бы вам "Бесполезное использование переменной в пустом контексте", потому что первое выражение игнорируется.
Вы всегда должны запускать свои программы с:
use strict;
use warnings;
Эти две строки помогут поймать множество распространенных ошибок, которые вы можете совершить. Иногда вам нужно отключить их для части кода, но вы должны понять правила, прежде чем вы сможете решить, когда можно их нарушать.
Если вы сделаете это в этой программе, вам нужно будет добавить my до %hash
.