2011-12-13 16 views
5

Il ; viene utilizzato come delimitatore di istruzioni, pertanto posizionare più ; alla fine di un'istruzione va bene poiché aggiunge solo istruzioni vuote.Punto e virgola Perl alla fine del prospetto

mi sono imbattuto in questo codice, che ha più ; alla fine, ma l'eliminazione di loro causando errori:

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

dovrebbe essere uguale a

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

ma non lo è. Cosa sta succedendo?

+2

Si è fatto molto più che rimuovere il punto e virgola nella seconda istruzione, ne è stato aggiunto uno nel mezzo. –

+5

[s //: "Qualsiasi delimitatore di spazi non bianchi può sostituire le barre."] (Http://perldoc.perl.org/perlop.html#s%2fPATTERN%2fREPLACEMENT%2fmsixpodualgcer) –

+4

Evidentemente chiunque l'abbia scritto pensava che fosse alto valore di divertimento – Zaid

risposta

7

Nel codice solo l'ultimo ; è la dichiarazione delimitatore. Gli altri sono delimitatori regex che l'operatore di sostituzione prende. Un modo migliore per scrivere questo è:

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

Dal momento che è necessario che il delimitatore dichiarazione e delimitatori regex nella sua dichiarazione, non è possibile eliminare una delle finali ;

13

nello snippet fornito dall'utente uno ; viene utilizzato come delimitatore per un'espressione regolare search-n-replace.

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

è equivalente a

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

Giusto per essere chiari - sì, è legale da fare. No, non dovresti mai farlo nel tuo codice a meno che tu non voglia che uno schifoso psicopatico ti colpisca la testa. E per delirio psicopatico intendo il prossimo sviluppatore che deve mantenere il tuo codice. – DVK

3

Un punto e virgola non è universalmente una dichiarazione separatore; può anche essere una stringa quotata o un delimitatore regex. O anche un nome variabile, come in questo classico JAPH di Abigail, dal titolo "Le cose non sono come sembrano".

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