Ogni linea di output è costituito da un elenco di parole
Queste linee devono essere ordinati con un ordinamento alfabetico che utilizza il sub-string a partire dalla parola chiave. La parola chiave inizia dopo la colonna 50, così abbiamo bisogno di una speciale procedura di supporto di ordinamento che raccoglie questi sotto-stringhe. La routine di ordinamento è simile al numeric_sort illustrato in precedenza. Essa si basa sulla convenzione che, prima che la routine viene chiamata, le variabili globali $ ae $ b saranno stati assegnati i due elementi di dati (in questo caso le linee di relazione) che devono essere confrontati.
by_keystr sub (my $ str1 = substr ($ a, 50); my $ str2 = substr ($ b, 50); if ($ str1 lt $ str2) (return -1;) elsif ($ str1 eq $ str2) ( return 0;) else (return 1;))
Questa subroutine richiede variabili locali per memorizzare i due sotto-stringhe. Perl consente la dichiarazione delle variabili la cui portata è limitata al corpo di una funzione (o, in ambito di un blocco interiore in cui sono dichiarati). Queste variabili vengono dichiarate con la parola mia, qui la funzione di supporto genere ha due variabili locali $ $ str1 e str2. Queste contengono le sotto-stringhe a partire dalla posizione 50 da due linee di prodotto. Il lt e confronti eq svolto su queste stringhe potrebbe essere semplificata usando l'operatore di Perl CMP (si tratta di una stringa di versione del gestore di cui, nel contesto della funzione di supporto numerico sort). Il corpo dei principali mentre le opere ciclo dividendo la linea in ingresso in una lista di parole e poi la trasformazione questa lista.
while ($ title = ) (Chomp ($ title); @ Title = split / /, $ title; ... foreach $ i (0 .. $ # Titolo) ($ parola = $ title [$ i]; ... ))
Ogni parola deve essere sottoposti a test per determinare se si tratta di una parola chiave. Questo può essere fatto utilizzando una partita semplice espressione regolare. Il modello di questa espressione regolare precisa che ci deve essere una lettera maiuscola all'inizio della stringa tenutasi a $ Word: if ($ Word = ~ / ^ [AZ] /) (... ) L'operatore = ~ è espressione regolare Perl corrispondenti operatore, questo è utilizzato per richiamare il confronto tra il valore di $ Word e / ^ [AZ] / pattern. Se la parola corrente è classificato come una parola chiave, allora le parole prima che sono combinati per formare la stringa di avvio, e la parola chiave e le parole rimanenti vengono combinate per formare una stringa fine. Queste stringhe possono essere combinati per produrre una linea per l'output finale. Questo risultato è ottenuto utilizzando la funzione sprintf (la stessa che in libreria C di stdio). La funzione sprintf crea una stringa in memoria, restituendo la stringa come risultato. Come printf, sprintf prende una stringa di formato e di un elenco di argomenti. Le linee di uscita indicata può essere prodotta utilizzando l'istruzione:
$ line = sprintf "% 50s%-50s fine \ n", $ start, $;
Il programma completo è:
#! / usr / bin / perl by_keystr sub (my $ str1 = substr ($ a, 50); my $ str2 = substr ($ b, 50); if ($ str1 lt $ str2) (return -1;) elsif ($ str1 eq $ str2) (return 0;) else (return 1;)
) @ Collection = (); while ($ title = ) (Chomp ($ title); @ Title = split / /, $ title, $ start = ""; foreach $ i (0 .. $ # Titolo) ($ parola = $ title [$ i]; if ($ Word = ~ / ^ [AZ] /) ($ end = ""; for ($ j = $ i, $ j In Perl, c'è sempre un altro modo! Un altro modo di costruire l'elenco $ end userebbe Perl's join funzione:
$ fine = join '' $ titolo [$ i .. $ # Titolo];
Perl si uniscono la funzione (documentata in perlfunc) ha due argomenti - un'espressione e una lista. Si costruisce una stringa unendo le stringhe separate della lista, e il valore di espressione è utilizzata come elemento di separazione. Perl viene fornito con le librerie di diverse migliaia di subroutine, spesso la maggior parte del vostro lavoro può essere fatto utilizzando le routine esistenti. Tuttavia, sarà necessario definire la subroutine proprio - se semplicemente per riordinare il vostro codice ed evitare un eccessivo grandi programmi linea principale. Routine Perl sono definite come:
blocco sotto il nome
Una procedura ha un valore di ritorno, questo è il valore dell'ultima istruzione eseguita o da un valore specificato in una dichiarazione esplicita di ritorno. Argomenti passati a una routine sono combinati in un unico elenco - @ _. Singoli argomenti possono essere isolate per l'indicizzazione in questa lista, o utilizzando una lista letterale come un lvalue. Come illustrato con la funzione di supporto di ordinamento nella parte finale, subroutine può definire il proprio ambito locale dettagli variables.Many più delle subroutine sono riportati nella parte perlsub della documentazione. Parentesi sono completamente facoltative nelle chiamate subroutine:
Process_data ($ arg1, $ arg2, $ arg3), è la stessa Process_data $ arg1, $ arg2, $ arg3;
Una definizione di tale routine è:
ottale sub (my $ str = $ _ [0]; my $ code = 0; for (my $ i = 1; $ i Questa subroutine potrebbe essere invocata:
rwxr $ str = "-x ---"; $ accesscode octal = $ str;
Per un secondo esempio, si consideri una subroutine per determinare se una particolare stringa è presente in una lista:
item (membro, list);
Come osservato in precedenza, gli argomenti per una routine sono combinati in un unico elenco, devono essere scisse nella routine. Il trattamento prevede un ciclo foreach che controlla se il membro lista seguente è uguale alla stringa desiderata:
membri sub (my ($ entry, @ list) = @ _; # separare gli argomenti foreach $ memb (@ list) (if (memb eq $ $ entry) (return 1;))
return 0;)
In realtà, c'è un altro modo. Non c'è bisogno di inventare una subroutine Perl membri, in quanto possiede già una versione generalizzata nella sua routine di grep. DataList match_criterion grep Quando viene utilizzato in un contesto di lista, grep produce un sotto-elenco con riferimenti a quei membri del DataList che soddisfano la prova. Quando utilizzato in un contesto scalare, grep restituisce il numero dei membri del DataList che soddisfano i requisiti.
un articolo presentato da Jorge Martinez
Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni.
Importante: Questo articolo "Ogni linea di output è costituito da un elenco di parole" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.