подстановка в строке - PullRequest
       0

подстановка в строке

0 голосов
/ 07 декабря 2011

У меня есть следующая строка ./test и я хочу заменить его на test Итак, я написал следующее в Perl: my $t =~ s/^.//; однако это заменяет ./test на /test Может кто-нибудь предложить, пожалуйста, как я это исправить, чтобы я тоже избавился от /. спасибо!

Ответы [ 8 ]

6 голосов
/ 07 декабря 2011
my $t =~ s/^\.\///;

Вам нужно убежать от точки и косой черты.

Подстановка s/match/replace/. Если вы удалите, это s/match//. Вы хотите сопоставить «начинается с точки и косой черты», и это ^\.\/.

4 голосов
/ 07 декабря 2011

Если вы хотите избавиться от ./, вам необходимо включить оба этих символа в регулярное выражение.

s/^\.\///;

Оба значения . и / имеют специальные значения в этом выражении (. является метасимволом регулярных выражений, означающим «любой символ», а / является разделителем для оператора s///), поэтому нам нужно избежать их обоих, поставив перед ними \.

Альтернативный (и, на мой взгляд, лучше) подход к проблеме / заключается в изменении символа, который вы используете в качестве разделителя s///.

s|^\./||;

Все это задокументировано в perldoc perlop .

4 голосов
/ 07 декабря 2011

Точка не делает то, что вы ожидаете - вместо того, чтобы соответствовать символу точки, она соответствует любому символу из-за его специальной обработки.Чтобы сопоставить точку и косую черту, вы можете переписать выражение следующим образом:

my $t =~ s|^\./||;

Обратите внимание, что вы можете использовать другой символ в качестве разделителя, чтобы не путать его с любыми такими символами.внутри регулярного выражения.

2 голосов
/ 08 декабря 2011
use Path::Class qw( file );
say file("./test")->cleanup();

Путь :: Class

2 голосов
/ 07 декабря 2011

Обратите внимание, что точка в вашем вопросе совпадает с любым символом, а не с литералом '.'.

my $t = './test';
$t =~ s{\./}{};
2 голосов
/ 07 декабря 2011
$t=q(./test);$t=~s{^\./}{};print $t;

Вам нужно экранировать точку, если вы хотите, чтобы она совпадала с точкой.В противном случае это соответствует любому символу.Вы можете выбрать альтернативные разделители - лучше всего при работе с косой чертой, чтобы не получить вид прислонившейся зубочистки, когда вам в противном случае тоже нужно их избежать.

2 голосов
/ 07 декабря 2011

Вам нужно написать my $t =~ s/^\.\///; (обратите внимание, что период должен быть экранирован, чтобы соответствовать буквальному периоду, а не любому символу).Если это слишком много косых черт, вы также можете изменить разделитель, написав вместо него, например, my $t =~ s:^\./::;.

2 голосов
/ 07 декабря 2011

Вы должны использовать обратную косую черту перед точкой и косую черту: s /\.\//; Обратная косая черта используется для записи символов, которые иначе имели бы другое значение в регулярном выражении.

...