Интерполяция переменных Perl в строке и подстановка одновременно

у меня глупый вопрос

given($num){
...
when($num >= 13 and $num <= 99) return "$num_in_eng{$num}teen" =~ s/tt/t/;
...
}

но он выдал ошибку «Невозможно изменить строку подстановки рядом с s/tt/t/g;

$_ = "$num_in_eng{$num}teen";
s/tt/t/;

Это работает нормально


person Dima Candu    schedule 01.11.2014    source источник
comment
я использовал его, не дал объяснения Вам не разрешено назначать указанный элемент или иным образом пытаться изменить его, например, с автоматическим увеличением   -  person Dima Candu    schedule 01.11.2014
comment
Вы можете выполнять s/// с переменными, а не с простыми строками. s///r может быть другое дело.   -  person mpapec    schedule 01.11.2014
comment
@mpapec, большое спасибо   -  person Dima Candu    schedule 01.11.2014
comment
mpapec: вам действительно следует опубликовать ответ с модификатором /r, поскольку он широко не используется   -  person Patrick J. S.    schedule 01.11.2014


Ответы (1)


Вы не можете назначить строковый литерал. Также не имеет смысла говорить "foo" = "bar".

Если вы попытаетесь использовать оператор сопоставления =~ с заменой (например, термин регулярного выражения, начинающийся с s, как в s/foo/bar/), результат замены будет присвоен левой стороне. Если это литерал, вы получите эту ошибку.

Неважно, что вы фактически использовали интерполяцию строк для создания литерала.

Используя локальную переменную и заменяя ее содержимое, как вы показали правильное решение. Вы также можете использовать именованную переменную вместо «по умолчанию» $_:

$foo = whatever();
$foo =~ s/tt/t/;
return $foo;
person Svante    schedule 01.11.2014