Код имеет дополнительный (экранированный) /
и будет соответствовать строкам с _/
(и //
во втором случае). Это не в ваших данных, которые имеют либо _
или /
, но не оба.
Кроме того, нет необходимости экранировать _
, а также /
, если он не является разделителем.
Чтобы соответствовать любому из нескольких символов, наиболее чистым и эффективным является класс символов
$string =~ s{[_/](\w+)}{-$1};
Чередование также работает здесь
$string =~ s{(?:_|/)(\w+)}{-$1};
, но это больше подходит, когда возможности сопоставления имеют больше символов (word|another
).
Здесь довольно много предположений, учитывая, как мало указано в вопросе. Например, \w
также соответствует цифрам и _
вместе с буквами. Если вы уточните требования, я отредактирую при необходимости.
Я предполагаю, что отсутствующий закрывающий разделитель, необходимый для компиляции кода, является опечаткой при публикации.