Perl Substitution - PullRequest
       35

Perl Substitution

2 голосов
/ 04 мая 2010

У меня есть переменная, которая хранит путь в Windows.Я хочу заменить все \ на / в пути.

например.$path = C:\Users\scripts.ps1

Я новичок в Perl и пробовал что-то вроде

$path = s/\\////

Но это не сработало.не могли бы вы помочь мне ....

Ответы [ 5 ]

10 голосов
/ 04 мая 2010

Если вы хотите кросс-платформенный способ сделать это, используйте File :: Spec .

($volume,$directories,$file) = File::Spec->splitpath( $path );
@dirs = File::Spec->splitdir( $directories );

Затем используйте catpath, чтобы присоединиться к нему.

6 голосов
/ 04 мая 2010

Ваша попытка была почти правильной. Давайте внимательнее посмотрим:

$path = s/\\////
             ^

Во-первых, чтобы подстановка работала с переменной $path, вам нужно использовать оператор связывания =~ , а не просто оператор присваивания. Далее, поскольку в качестве разделителя подстановки вы использовали обычный символ косой черты, указанная выше косая черта фактически обозначает end команды подстановки, а оставшиеся две косые черты - просто мусор. Похоже, вы могли подумать, что правило для обхода специальных свойств символа - удваивать его. Если единственным примером является обратная косая черта, то это правило может иметь смысл, но на самом деле правило состоит в том, чтобы ставить префикс специальных символов с обратной косой чертой . Замените эту выделенную косую черту обратной косой чертой, и она станет escape-символом , поэтому мы пропускаем специальную функцию следующей косой черты, чтобы рассматривать ее как обычную косую черту, после чего косая черта после этого правильно завершает замена:

$path =~ s/\\/\//

Но это трудно читать. К счастью, вам не нужно требовать , чтобы использовать косую черту в качестве разделителя подстановки; Вы можете использовать практически любой символ, который вы хотите. Выберите разделитель, который не похож на текст, который вы пытаетесь заменить , и ваш код станет более читабельным. Подробности в perlop в Операторы с кавычками и цитатами . Когда выбранный вами символ образует пару с другим символом, вы используете оба, чтобы заключить две части выражения. И, кроме того, поскольку вы, вероятно, хотите заменить все косые черты в вашей строке, вы должны использовать модификатор g в конце, сообщая, что он соответствует глобально вместо остановки после первая замена. Собираем все вместе:

$path =~ s{\\}{/}g

Поскольку вы заменяете один символ на другой, вы можете использовать более специализированный оператор транслитерации tr вместо s. Это автоматически применяется глобально.

$path =~ tr{\\}{/}

Наконец, если это больше, чем просто однократная операция пути (т. Е. Вы делаете это несколько раз в сценарии, или сценарий будет поддерживаться какое-то время), или вам нужен код, чтобы запустить его на на нескольких платформах рассмотрите возможность использования File :: Spec module . Он позволяет разделять и объединять компоненты пути, используя правильный разделитель для любой платформы, на которой вы работаете.

4 голосов
/ 04 мая 2010

Для некоторого разнообразия, давайте также упомянем оператор tr

$path =~ tr!\\!/!;

или

$path =~ y!\\!/!;

заменит все экземпляры \ на / в $path

3 голосов
/ 04 мая 2010

Если вы используете другой разделитель шаблонов, вам не нужно экранировать косую черту:

$path =~ s!\\!/!g;
3 голосов
/ 04 мая 2010

$path =~ s/\\/\//g;

g в конце заменяет каждый вхождение \, а не только первый.

...