Если вам абсолютно не нужно использовать регулярное выражение, используйте и рассмотрите возможность использования Perl's Text :: Balanced для удаления скобок.
use Text::Balanced qw(extract_bracketed);
my ($extracted, $remainder, $prefix) = extract_bracketed( $filename, '()', '[^(]*' );
{ no warnings 'uninitialized';
$filename = (defined $prefix or defined $remainder)
? $prefix . $remainder
: $extracted;
}
Возможно, вы думаете: «Зачем все это, когда регулярное выражение выполняет трюк в одной строке?»
$filename =~ s/\([^}]*\)//;
Text :: Balanced обрабатывает вложенные скобки. Так что $filename = 'foo_(bar(baz)buz)).foo'
будет извлечен правильно. Предлагаемые здесь решения на основе регулярных выражений потерпят неудачу в этой строке. Один остановится на первом закрытии, другой съест их всех.
$ filename = ~ s / ([^}] *) //;
# возвращает 'foo_buz)). foo'
$ filename = ~ s /(.*)//;
# возвращает 'foo_.foo'
# сбалансированный текстовый пример возвращает 'foo _). Foo'
Если какое-либо из поведений регулярного выражения приемлемо, используйте регулярное выражение - но задокументируйте ограничения и сделанные предположения.