Если вы просто хотите, чтобы удалить скобки, как следует из названия, оператор подстановки s///
является естественным выбором:
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt;
$parser =~ s/[()]//g;
Тем не менее, это немного трудно догадаться, что вы действительно хотите делать и какие возможные входы у вас есть. Основываясь на сломанном регулярном выражении в сообщении, возможно, вы действительно хотите изменить модели \s*\(X\)
на X
. Если это так, то вместо подстановки, будет проще использовать сопоставление с захвата группы, подобно тому, как вы, кажется, пытались:
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my ($parser) = join('', $subckt =~ m/\s*\((.*?)\)/g);
Это также будет работать с входным сигналом как это:
my $subckt = ' (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)';
как это работает:
m/...(...).../g
возвращает список совпавших строк захваченный в (...)
- То, что вы хотите, чтобы соответствовать этому веществу в буквальном
(
и )
, так что выражение на самом деле должно выглядеть m/...\((...)\).../g
, обратите внимание на \(
и \)
за пределы (...)
захвата
- Флаг
/g
является важным (не хватал в ваших), в противном случае сопоставление с образцом остановится после первого матча
Одна из причин downvote будет: Это не работает, если строка не содержит круглые скобки. Это не работает, если скобки не сбалансированы. Он имеет случайное совпадение пробелов '\ s *', которое ничего не делает. Тот факт, что он работает вообще, заключается в том, что вы используете только определенный набор входных данных. Гораздо лучшей версией того же самого было бы использовать регулярное выражение '/ [^()] +/g'. Но даже тогда он уступает простому удалению '()' с 'tr', как предлагает Бородин. – TLP
Кроме того, это может привести к неправильному результату, например, 'ABC (D' вернет' ABC', а не 'ABCD'. – TLP
@TLP OP имел' \ s * \ ('в своем шаблоне, предлагая ему чтобы избавиться от не только parens, но и любых пробелов прямо перед открытием. Что правильно и что не так делать с ABC (D' - это спекуляция, потому что OP не предоставлял никакой информации о таких входах. если вы просто хотите удалить '()', то 'tr ///' не является правильным инструментом, это должно быть 's ///'. В любом случае, я переписал свой пост, чтобы уточнить – janos