Wenn Sie nicht unbedingt einen regulären Ausdruck verwenden müssen, sollten Sie Perls Text :: Balanced verwenden , um die Klammern zu entfernen.
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;
}
Sie denken vielleicht: "Warum das alles, wenn ein Regex den Trick in einer Zeile macht?"
$filename =~ s/\([^}]*\)//;
Text :: Balanced behandelt verschachtelte Klammern. Also $filename = 'foo_(bar(baz)buz)).foo'
wird richtig extrahiert. Die hier angebotenen Regex-basierten Lösungen schlagen bei dieser Zeichenfolge fehl. Der eine wird beim ersten schließenden Paren anhalten und der andere wird sie alle essen.
$ filename = ~ s / ([^}] *) //; # gibt 'foo_buz)) zurück. foo'
$ filename = ~ s /(.*)//; # gibt 'foo_.foo' zurück
# text balanciertes Beispiel gibt 'foo _) zurück. foo'
Wenn eines der Regex-Verhaltensweisen akzeptabel ist, verwenden Sie einen Regex - dokumentieren Sie jedoch die Einschränkungen und die getroffenen Annahmen.