Замените звездочку (*) с помощью регулярного выражения Perl

#regex #perl

Вопрос:

У меня есть следующая строка:

$_='364*84252';

Вопрос в следующем: как заменить * строку чем-то другим? Я пробовал s/*/$i/ , но есть ошибка: Quantifier follows nothing in regex . С другой стороны s/'*'/$i/ , это не вызывает никаких ошибок, но и, похоже, не имеет никакого эффекта вообще.

Комментарии:

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

2. @Брэд: Как в настоящее время придумано, $i это в RHS; /o адресуйте только часть соответствия в LHS s/// операции.

Ответ №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/ работает нормально.