Negaciones y operadores no greedy

No siempre se puede usar un operador greedy en sustitución de una clase negada. En este ejemplo se intentan detectar las cadenas entre comillas dobles que terminan en el signo de exclamación:
> cat negynogreedy.pl
#!/usr/bin/perl

 $b = $a = 'Ella dijo "Ana" y yo contesté: "Jamás!". Eso fué todo.';
 $a =~ s/".*?!"/-$&-/;
 print "$a\n";
 $b =~ s/"[^"]*!"/-$&-/;
 print "$b\n";

> negynogreedy.pl
Ella dijo -"Ana" y yo contesté: "Jamás!"-. Eso fué todo.
Ella dijo "Ana" y yo contesté: -"Jamás!"-. Eso fué todo.

Casiano Rodríguez León
2009-10-04