2013-05-18 16 views
6

Ho bisogno di creare una subroutine in Perl che determina se una stringa inizia con un carattere maiuscolo. Quello che ho finora è il seguente:Determinare se una stringa inizia con un carattere maiuscolo in Perl

sub checkCase { 
    if ($_[0] =~ /^[A-Z]/) { 
     return 1; 
    } 
    else { 
     return 0; 
    } 
} 

$result1 = $checkCase("Hello"); 
$result2 = $checkCase("world"); 
+0

... e? Come non funziona? –

+2

significa lettera maiuscola dall'ASCII? o unicode lettera maiuscola o punto di codice maiuscolo? – jm666

risposta

4

Questo è quasi corretto. Ma il [A-Z] potrebbe non corrispondere ai caratteri accentati maiuscoli in base alla locale. Meglio usare /^[[:upper:]]/.

Anche le chiamate di subroutine non devono avere il carattere $ davanti a esse. Cioè dovrebbero essere:

$result1 = checkCase("Hello"); 
$result2 = checkCase("world"); 
+1

* "non dovrebbe avere il' $ '" * è un eufemismo, è un errore di sintassi. Suppongo che @DanJones abbia significato l'invocazione di stile '& sub', ma hai ragione che non dovrebbe essere usato neanche questo. – amon

8

Il codice è bene finché si rimuove il $ dalla parte anteriore della vostra chiamata subroutine. Un simbolo del dollaro indica un valore scalare, e le chiamate dovrebbe essere simile

$result1 = checkCase("Hello"); 
$result2 = checkCase("world"); 

la subroutine è anche unnec riamente lunga. La corrispondenza regex restituisce un valore vero/falso e si sta utilizzando tale valore per restituire valori true/false diversi 1 o 0. Molto meglio restituire direttamente il risultato della corrispondenza regex.

Infine, se si lavora con caratteri ASCII, è possibile utilizzare la Maiuscolo lettera Categoria Unicode, che viene codificata utilizzando \p{Lu}.

Spero che questa variazione sul codice sia utile. Ho cambiato leggermente il nome della subroutine perché è pratica comune usare solo lettere minuscole e caratteri di sottolineatura per identificatori di variabili e subroutine. Le lettere maiuscole sono riservate ai globals come i nomi dei pacchetti.

sub check_case { 
    $_[0] =~ /^\p{Lu}/ 
} 

print check_case('Hello') ? 'YES' : 'NO', "\n"; 
print check_case('world') ? 'YES' : 'NO', "\n";