Ваша попытка была почти правильной. Давайте внимательнее посмотрим:
$path = s/\\////
^
Во-первых, чтобы подстановка работала с переменной $path
, вам нужно использовать оператор связывания =~
, а не просто оператор присваивания. Далее, поскольку в качестве разделителя подстановки вы использовали обычный символ косой черты, указанная выше косая черта фактически обозначает end команды подстановки, а оставшиеся две косые черты - просто мусор. Похоже, вы могли подумать, что правило для обхода специальных свойств символа - удваивать его. Если единственным примером является обратная косая черта, то это правило может иметь смысл, но на самом деле правило состоит в том, чтобы ставить префикс специальных символов с обратной косой чертой . Замените эту выделенную косую черту обратной косой чертой, и она станет escape-символом , поэтому мы пропускаем специальную функцию следующей косой черты, чтобы рассматривать ее как обычную косую черту, после чего косая черта после этого правильно завершает замена:
$path =~ s/\\/\//
Но это трудно читать. К счастью, вам не нужно требовать , чтобы использовать косую черту в качестве разделителя подстановки; Вы можете использовать практически любой символ, который вы хотите. Выберите разделитель, который не похож на текст, который вы пытаетесь заменить , и ваш код станет более читабельным. Подробности в perlop в Операторы с кавычками и цитатами . Когда выбранный вами символ образует пару с другим символом, вы используете оба, чтобы заключить две части выражения. И, кроме того, поскольку вы, вероятно, хотите заменить все косые черты в вашей строке, вы должны использовать модификатор g
в конце, сообщая, что он соответствует глобально вместо остановки после первая замена. Собираем все вместе:
$path =~ s{\\}{/}g
Поскольку вы заменяете один символ на другой, вы можете использовать более специализированный оператор транслитерации tr
вместо s
. Это автоматически применяется глобально.
$path =~ tr{\\}{/}
Наконец, если это больше, чем просто однократная операция пути (т. Е. Вы делаете это несколько раз в сценарии, или сценарий будет поддерживаться какое-то время), или вам нужен код, чтобы запустить его на на нескольких платформах рассмотрите возможность использования File :: Spec module . Он позволяет разделять и объединять компоненты пути, используя правильный разделитель для любой платформы, на которой вы работаете.