#regex #perl
Вопрос:
У меня есть следующая строка:
$_='364*84252';
Вопрос в следующем: как заменить *
строку чем-то другим? Я пробовал s/*/$i/
, но есть ошибка: Quantifier follows nothing in regex
. С другой стороны s/'*'/$i/
, это не вызывает никаких ошибок, но и, похоже, не имеет никакого эффекта вообще.
Комментарии:
1. Второй пример-поиск одного или нескольких апостофов, вот почему он не работает. Однако первое должно сработать, как отмечается в приведенных ответах.
2. @Брэд: Как в настоящее время придумано,
$i
это в RHS;/o
адресуйте только часть соответствия в LHSs///
операции.
Ответ №1:
Здесь есть еще кое-что странное…
~> cat test.pl
$a = "234*343";
$i = "FOO";
$a =~ s/*/$i/;
print $a;
~> perl test.pl
234FOO343
Нашел кое-что:
~> cat test.pl
$a = "234*343";
$i = "*4";
$a =~ m/$i/;
print $a;
~> perl test.pl
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE 4/ at test.pl line 4.
Решение, экранируйте специальные символы из переменной с помощью Q
и E
, например (TIMTOWTDI)
~> cat test.pl
$a = "234*343";
$i = "*4";
$a =~ m/Q$iE/;
print $a;
~> perl test.pl
234*343
Ответ №2:
$ perl -le '$_="364*84252";s/*/xx/;print'
364xx84252
Определенно работает. Возможно, вы используете двойные кавычки в одной строке вместо одинарных кавычек? Я не уверен — я вообще не могу воспроизвести ваши результаты. Вам нужно будет дать немного больше информации о вашей проблеме, желательно с кодом, который мы можем запустить для воспроизведения ваших результатов.
Ответ №3:
Тогда это, должно быть, проблема psh. Запуск скрипта с perl xx.pl не выдает никаких ошибок. Спасибо за помощь 😉
Строки сами убегают от обратных косых черт. В этом случае вам, вероятно, следует удвоить обратную косую черту, чтобы s/\*/$i/
Комментарии:
1. Я не уверен, что вы имели в виду четырехкратную обратную косую черту. Я только что отформатировал in
Courier
, но не изменил ваш код. Вы могли бы просмотреть его еще раз, если у вас будет возможность.2. @tchrist: Четверка произошла из-за того, что markdown требует, чтобы кто-то цитировал обратные косые черты за пределами разделов кода. Вам следовало бы сократить их вдвое, прежде чем помещать их в такой раздел 😉
Ответ №4:
Еще лучше использовать
$InputLine =~ s/Q*E//g;
Это должно удалить звездочки в любом месте строки переменной.
Ответ №5:
пробовать
$VARIABLE =~ s/Q*E//;
Комментарии:
1. в этом случае вам это не понадобится
E
, потому что за этим ничего не следует.2. Я был бы рад немного объяснить ваш ответ вместо того, чтобы писать одну строчку. Для меня это больше похоже на комментарий …
Ответ №6:
Ошибка, должно быть, исходит от $i
. s/*/foo/
работает нормально.