2010-06-23 10 views
10

piccolo esempio:Quante sostituzioni sono avvenute in un Perl s /// g?

perl -e '$s="aaabbcc";$c=()=$s=~/a/g;print"$c\n$s\n"' (m // g) Uscite

3 
aaabbcc 

mentre perl -e '$s="aaabbcc";$c=()=$s=~s/a/x/g;print"$c\n$s\n"' (s /// g) uscite

1 
xxxbbcc 

Mi piacerebbe fare entrambe le cose una volta senza doversi confrontare prima: sostituire e conoscere il numero di sostituzioni. Ovviamente un s/g non restituisce il numero di sostituzioni nel contesto scalare, diversamente da m // g con le corrispondenze. È possibile? Se sì, come?

perlre, perlvar e perlop non hanno fornito alcun aiuto (o semplicemente non sono riuscito a trovarlo).

risposta

14

s/// restituisce il numero di sostituzioni effettuate in contesto scalare. Da perlop (enfasi aggiunta):

s/Modello/Sostituto/msixpogce
Ricerche una stringa per un motivo, e se trovato, sostituisce quello modello con il testo sostitutivo e restituisce il numero di sostituzioni effettuate. Altrimenti restituisce false (in particolare, la stringa vuota).

Il tuo problema è che non hai chiamato s/// in contesto scalare. L'hai chiamato in contesto elenco e poi hai valutato l'assegnazione (in una lista vuota) in un contesto scalare. Un'assegnazione lista in contesto scalare restituisce il numero di elementi prodotti dal lato destro dell'espressione. Poiché s/// restituisce un valore singolo (sia in elenco che in contesto scalare), il numero di elementi è sempre uno anche se lo s/// non ha fatto nulla.

perl -E "$s='aaabbcc'; $c=()=$s=~s/x/y/g; say qq'$c-$s'" # prints "1-aaabbcc" 

Per chiamare s/// nel contesto scalare, omettere lo pseudo-operatore =()=.

perl -E "$s='aaabbcc'; $c=$s=~s/a/x/g; say qq'$c-$s'" # prints "3-xxxbbcc" 
+1

In realtà, non ha valutato l'elenco in un contesto scalare. Questo è impossibile. Ha valutato il ** elenco di incarichi ** in contesto scalare. – daotoad

+1

@daotoad: Grazie, sapevo che non era giusto, ma la terminologia mi sfuggì per un momento. Tangente: perché non più persone usano la loro capacità di modifica per correggere solo dettagli del genere? –

+1

Non riesco a riflettere sulle motivazioni degli altri, ma non modifico ciò che le altre persone scrivono in un modo che cambia l'intento o il significato. Per esempio, ci sono alcune persone che sono appassionate della loro fede nell'esistenza di "liste in contesto scalare" in Perl, se tu fossi una di queste persone, sarebbe molto offensivo per me mettere delle parole in bocca che rinnegano la tua (errato e putativo) convinzione. Ci sono anche casi in cui ** la mia ** comprensione è errata e cambiare il post potrebbe renderlo sbagliato. Per questi motivi, preferisco segnalare gli errori piuttosto che "sistemarli". YMMV – daotoad

Problemi correlati