2010-11-04 3 views
14

So circa l'uso di hash dell'operatore =>, like thisCome funziona l'operatore di doppia freccia (=>) in Perl?

$ cat array.pl 
%ages = ('Martin' => 28, 
     'Sharon' => 35, 
     'Rikke' => 29,); 

print "Rikke is $ages{Rikke} years old\n"; 
$ perl array.pl 
Rikke is 29 years old 
$ 

e ho pensato che fosse solo la sintassi per inizializzare hash, ma in risposta alle How can I qualify a variable as const/final in Perl?, => è stato utilizzato come questo

use Readonly; 
Readonly my $infilename => "input_56_12.txt"; 

Che cosa significa esattamente =>? Esistono altri modi in cui è possibile utilizzare =>?

+5

Leggere la documentazione. Dovresti aver automaticamente raggiunto [perldoc perlop] (http://perldoc.perl.org/perlop.html), il luogo in cui è possibile trovare le informazioni sugli operatori, prima che tu lo abbia postato, e poi potresti fare una domanda di chiarimento se devi. Sta diventando davvero noioso avere così tante risposte che citano semplicemente dalla documentazione - questo NON sta aggiungendo conoscenza. – Ether

+6

Abbastanza giusto. A mia difesa, ho fatto Google, che ha rifiutato la ricerca di '=>'. – Lazer

+2

Ma contro la tua difesa, a quanto pare hai rinunciato dopo. –

risposta

28

L'operatore => in perl è praticamente uguale alla virgola. L'unica differenza è che se c'è una parola non quotata a sinistra, viene trattata come una parola quotata. Quindi potresti aver scritto Martin => 28 che sarebbe lo stesso di 'Martin', 28.

È possibile creare un hash da qualsiasi elenco di lunghezza pari, il che è tutto ciò che si sta facendo nell'esempio.

L'esempio Readonly sta sfruttando la flessibilità di Perl con gli argomenti di subroutine omettendo la parentesi. È equivalente a Readonly(my $infilename, "input_56_12.txt"). Readonly è una funzione esportata dal modulo Readonly che accetta due argomenti: un riferimento e un valore. Gli interni di Readonly sono degni di un'altra domanda se vuoi capirli.

Ecco un esempio di utilizzarlo come una virgola in modo inaspettato:

$ perl -e 'print hello => "world\n"' 
helloworld 
+0

Quindi, cosa significa 'Readonly my $ infilename =>" input_56_12.txt ";' fare? – Lazer

+0

È solo una virgola. Potresti riscriverlo come: 'Readonly (my $ infilename," input_56_12.txt ");'. Per ulteriori dettagli sul modulo Readonly (un'alternativa alla costante), consultare http://search.cpan.org/perldoc?Readonly –

24

Da perlop:

L'operatore => è sinonimo di virgola, tranne che provoca la sua left operando da interpretare come stringa se inizia con una lettera o underscore ed è composto solo da lettere, cifre e caratteri di sottolineatura.

Ciò include operandi che potrebbe altrimenti essere interpretati come operatori, costanti, numero unico v-string o chiamate di funzione. In caso di dubbi sul comportamento di , l'operando di sinistra può essere quotato in modo esplicito.

caso contrario, l'operatore => si comporta esattamente come l'operatore virgola o elenco separatore di argomenti, secondo contesto.

Ad esempio:

use constant FOO => "something"; 
my %h = (FOO => 23); 

è equivalente a:

my %h = ("FOO", 23); 

NO:

my %h = ("something", 23); 

L'operatore => è utile nella documentare la corrispondenza tra chiavi e valori in hash e altri elementi accoppiati negli elenchi.

%hash = ($key => $value); 
login($username => $password); 

Da PBP:

Ho trovato alcune buone informazioni da Perl Best Practices circa Fat virgole=> e penso che dovrebbe essere bello parlare qui pure.

E 'meglio prenotare il grasso Comma esclusivamente per le seguenti cose: -

usarlo quando costruire un hash:

my %h = (FOO => 23); 

o quando passa argomenti con nome ad una subroutine es. ,

$text = format_text({FOO => 23, BAR => 30}); 

o quando c REAZIONE una costante:

Readonly my $FOO => "23"; 

Per ulteriori dettagli vedere il Capitolo 4: Valori e sezione del Perl Best Practices espressioni (Fat virgole).