Incrementare le stringhe in PHP (e Perl)

0

PHP ti permette di incrementare le stringhe. Perché?

Andiamo avanti un po '. Prendi il seguente codice:

$string = '9ZzZ';
echo ++$string; // 10AaA

Da un punto di vista purista questo può sembrare un non senso, tuttavia, puoi vedere che qui c'è chiaramente uno schema. Ogni colonna viene trattata come un insieme, (numeri, lettere maiuscole, lettere minuscole). Quindi ogni set si comporta come il proprio sistema di numerazione.

Il manuale conferma questo e dichiara di aver copiato Perl:

PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in PHP and Perl $a = 'Z'; $a++; turns $a into 'AA', while in C a = 'Z'; a++; turns a into '[' (ASCII value of 'Z' is 90, ASCII value of '[' is 91). Note that character variables can be incremented but not decremented and even so only plain ASCII alphabets and digits (a-z, A-Z and 0-9) are supported. Incrementing/decrementing other character variables has no effect, the original string is unchanged.

Ma in realtà non spiega perché.

il manuale di Perls afferma qualcosa di molto simile, ma di nuovo si passa a no spiegazione del motivo per cui è stata aggiunta questa magia extra.

The auto-increment operator has a little extra builtin magic to it. If you increment a variable that is numeric, or that has ever been used in a numeric context, you get a normal increment. If, however, the variable has been used in only string contexts since it was set, and has a value that is not the empty string and matches the pattern /^[a-zA-Z][0-9]\z/ , the increment is done as a string, preserving each character within its range, with carry

Allo stesso modo enigmatico:

The auto-decrement operator is not magical.

Perché l'incremento è così importante ma non il decremento? E perché dovrebbero farlo affatto?

È logico a modo suo, e posso vederne gli usi (anche se potresti scrivere qualcosa di più ovvio al suo posto). Posso persino vedere perché non hanno dovuto eseguire il millisecode del set di caratteri ASCII (poiché potrebbe non essere il set di caratteri utilizzato dall'utente) o attraverso il set di caratteri definito in php.ini in quanto ciò potrebbe alterare in modo significativo il comportamento tra i sistemi. Allora perché preoccuparsi del tutto?

    
posta DanielM 20.10.2015 - 17:17
fonte

2 risposte

3

La mia comprensione è che la funzione era originariamente pensata per generare sequenze di nomi di file per script che devono produrre numeri variabili di file di output. Sebbene sia possibile utilizzare un semplice contatore per lo scopo, questo ha alcuni inconvenienti (la lunghezza del nome imprevedibile causa un cattivo ordinamento quando i file sono elencati in ordine alfabetico, le lettere sono preferibili alle cifre quando sono necessari molti file per mantenere i nomi generati brevi), entrambi i quali può essere risolto inizializzando il tuo contatore su (ad esempio) 'aaaa'.

Mentre altre soluzioni sono chiaramente possibili e non sono nemmeno particolarmente difficili, la soluzione di perl è straordinariamente sintetica.

Perché php ha copiato l'idea, non ne sono sicuro. Non è mai stato realmente inteso per il tipo di applicazione che ne beneficia. Forse ha qualcosa a che fare con il fatto che perl era la lingua dominante per lo scripting web al momento.

    
risposta data 20.10.2015 - 17:30
fonte
2

C'è un'utilità davvero utile nel mondo unix per dividere file di grandi dimensioni chiamati (senza presunzione) split .

Output pieces of FILE to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is 'x'.

Puoi vedere quell'incremento delle stringhe lì.

Perl è particolarmente utile in situazioni in cui si vuole estrarre la motosega dell'esercito svizzero del mondo delle utilità unix. In passato ho utilizzato questa funzionalità per scrivere i miei strumenti che avevano bisogno di funzionalità simili a quelle fornite da split . E 26 3 valori possibili in due caratteri è un po 'più di 10 3 .

Sul motivo per cui ++ è magico mentre -- non lo è? È perché è facile identificare un'aspettativa consistente per ciò che ++ su una stringa fa sulle condizioni al contorno mentre -- non ha aspettative facili.

$foo = "zz";
$foo++;
print "$foo\n";

Questo è aaa . Molto simile a come ci si aspetterebbe che si comportasse:

$foo = 99;
$foo++;
print "$foo\n";

E mentre:

$foo = 0;
$foo--;
print "$foo\n";

ti dà -1 , dovrebbe:

$foo = "a";
$foo--;
print "$foo\n";

tornare? E con questo, il progettista alza le braccia e dice "sai cosa, non c'è un caso d'uso per questo e non riesco a farlo funzionare in modo coerente che non è sorprendente per il programmatore." e dice invece "non è magico" e lo lascia a quel punto.

    
risposta data 20.10.2015 - 17:37
fonte

Leggi altre domande sui tag