Якщо вам абсолютно не потрібно використовувати регулярний вираз, скористайтесь можливістю використовувати 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/\([^}]*\)//;
Текст :: Збалансовані дескриптори вкладених дужок. Так $filename = 'foo_(bar(baz)buz)).foo'
буде видобуто правильно. Запропоновані тут рішення на основі регулярних виразів не зможуть використовувати цей рядок. Один зупиниться біля першого закриваючого батька, а інший з’їсть усіх.
$filename =~ s/\([^}]*\)//;
$filename =~ s/\(.*\)//;
Якщо будь-яка з поведінок регулярних виразів є прийнятною, використовуйте регулярний вираз - але задокументуйте обмеження та припущення, що висуваються.