El fallo está, en que la interpolación de la variable $linea dentro de la expresión regular, es igual que si hubieras escrito un '+' directamente, por lo que el motor de expresiones regulares lo interpreta como un cuantificador, no como un carácter normal.
Hay varias soluciones que se me ocurren:
Using perl Syntax Highlighting
# "escapando" el significado de '+' con la barra diagonal inversa
$frase =~ s/\+//;
# "escapando" el '+' como un carácter peligroso
$frase =~ s/\Q+//;
# '+' es un carácter normal
$frase =~ s/[+]//;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
también puedes hacerlo con una variable:
Using perl Syntax Highlighting
$linea = '\+' # atención: son comillas simples
$linea = "\Q+"; # vale cualquiera de estas formas
$linea = "[+]";
$frase =~ /$linea//;
# e incluso
$linea = '+';
$frase =~ s/\Q$linea//; # \Q...\E sirve para "escapar" los caracteres peligrosos
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Otra forma: como el carácter está al principio de la $frase (sabemos su posición), pues podemos quedarnos con lo que nos interesa:
Using perl Syntax Highlighting
$frase = substr $frase, 1; # nos quedamos con lo que hay en $frase, a partir del segundo carácter
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4