2011-12-13 26 views
5

; se utiliza como un delimitador de enunciado, por lo que colocar ; al final de una instrucción está bien, ya que solo agrega declaraciones vacías.Perl punto y coma al final de la instrucción

me encontré con este código que tiene múltiples ; al final, pero la eliminación de ellos causando errores:

$line =~s;[.,]$;;; 

debe ser el mismo que

$line =~s;[.,;]$; 

pero no lo es. ¿Que esta pasando?

+2

Has hecho algo más que eliminar los puntos y comas en la segunda instrucción, has añadido uno en el medio de ella. –

+5

[s //: "Cualquier delimitador que no sea un espacio en blanco puede reemplazar las barras".] (Http://perldoc.perl.org/perlop.html#s%2fPATTERN%2fREPLACEMENT%2fmsixpodualgcer) –

+4

Evidentemente, quien lo escribió pensó que tenía alto valor de entretenimiento – Zaid

Respuesta

7

En su código sólo el último ; es la declaración delimitador. Los otros son delimitadores de expresiones regulares que toma el operador de sustitución. Una mejor manera de escribir esto es:

$line =~s/[.,]$//; 

Puesto que debe tener el delimitador de sentencias y delimitadores de expresiones regulares en su estado de cuenta, no se puede caer cualquiera de los trailing ;

13

en el fragmento provisto por usted, un ; se utiliza como un delimitador para una expresión regular search-n-replace.

$line =~s;[.,]$;;; 

es equivalente a

$line =~ s/[.,]$//; 
+4

Para que quede claro, sí, es legal. No, nunca deberías hacer eso en tu código a menos que quieras que un psicópata delirante te asombre. Y alucinar psicópata me refiero al próximo desarrollador que tiene que mantener tu código. – DVK

3

Un punto y coma no es universalmente una declaración separador; también puede ser una cadena entre comillas o un delimitador de expresiones regulares. O incluso un nombre de variable, como en este JAPH clásico de Abigail, titulado "Las cosas no son lo que parecen".

$;        # A lone dollar? 
=$";       # Pod? 
$;        # The return of the lone dollar? 
{Just=>another=>Perl=>Hacker=>} # Bare block? 
=$/;       # More pod? 
print%;       # No right operand for %? 
Cuestiones relacionadas