Perl string sub - PullRequest
       1

Perl string sub

4 голосов
/ 25 июня 2010

Я хочу заменить что-то на путь типа C:\foo, поэтому я:

s/hello/c:\foo

Но это неверно. Мне нужно сбежать от некоторых персонажей?

Ответы [ 3 ]

5 голосов
/ 25 июня 2010

Две проблемы, которые я вижу.

Ваша первая проблема заключается в том, что замена s/// не прекращена:

s/hello/c:\foo   # fatal syntax error:  "Substitution replacement not terminated"
s/hello/c:\foo/  # syntactically okay
s!hello!c:\foo!  # also okay, and more readable with backslashes (IMHO)

Ваша вторая проблема, та, о которой вы спрашивали,что \f принимается как escape-последовательность формы (ASCII 0x0C), так же, как это было бы в двойных кавычках, а это не то, что вам нужно.обратная косая черта или переменная интерполяция «скрывают» проблему:

s!hello!c:\\foo!            # This will do what you want.  Note double backslash.

my $replacement = 'c:\foo'  # N.B.:  Using single quotes here, not double quotes
s!hello!$replacement!;      # This also works

Посмотрите на обработку Операторов типа «цитирование» и «Цитата» в perlop для получения дополнительной информации.

2 голосов
/ 25 июня 2010

Если я понимаю, что вы спрашиваете, то это может быть что-то вроде того, что вы ищете:

$path = "hello/there";
$path =~ s/hello/c:\\foo/;
print "$path\n";

Чтобы ответить на ваш вопрос, да, вам нужно удвоить обратную косую черту, потому что \fявляется escape-последовательностью для «подачи формы» в строке Perl.

1 голос
/ 25 июня 2010

Проблема в том, что вы не экранируете специальные символы:

s/hello/c:\\foo/;

решит вашу проблему.\ - это специальный символ, поэтому вам нужно его избежать.{}[]()^$.|*+?\ являются мета (специальными) символами, которые необходимо экранировать.

Дополнительная ссылка: http://perldoc.perl.org/perlretut.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...