2010-11-04 50 views
14

Je sais que sur l'utilisation de hachage de l'opérateur =>, like thisComment fonctionne l'opérateur double flèche (=>) en 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 
$ 

et je pensais que c'était juste la syntaxe pour initialiser hash, mais en réponse à How can I qualify a variable as const/final in Perl?, => a été utilisé comme celui-ci

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

Que signifie exactement =>? Existe-t-il d'autres façons d'utiliser =>?

+5

Veuillez lire la documentation. Vous devriez avoir automatiquement atteint [perldoc perlop] (http://perldoc.perl.org/perlop.html), l'endroit où les informations sur les opérateurs peuvent être trouvées, avant de poster ceci, et vous pourriez alors demander une question de clarification si tu dois. Il devient vraiment fastidieux d'avoir autant de réponses simplement en citant la documentation - ce n'est pas ajouter des connaissances. – Ether

+6

Assez juste. Pour ma défense, j'ai fait Google, qui a refusé de rechercher '=>'. – Lazer

+2

Mais contre votre défense, vous avez apparemment abandonné après cela. –

Répondre

28

L'opérateur => dans Perl est fondamentalement le même que la virgule. La seule différence est que s'il y a un mot non cité à gauche, c'est traité comme un mot entre guillemets. Donc, vous auriez pu écrire Martin => 28 qui serait le même que 'Martin', 28.

Vous pouvez créer un hachage à partir de n'importe quelle liste de longueur égale, ce que vous faites dans votre exemple.

Votre exemple Readonly tire parti de la flexibilité de Perl avec les arguments de sous-programme en omettant les parenthèses. C'est équivalent à Readonly(my $infilename, "input_56_12.txt"). Readonly est une fonction exportée par le module Readonly qui prend deux arguments: une référence et une valeur. Les internes de Readonly sont dignes d'une autre question si vous voulez les comprendre.

Voici un exemple de l'utiliser comme une virgule d'une manière inattendue:

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

Alors, que fait Readonly my $ infilename => "input_56_12.txt"; 'do? – Lazer

+0

C'est juste une virgule. Vous pouvez le réécrire comme suit: 'Readonly (my $ infilename," input_56_12.txt ");'. Pour plus de détails sur le module Readonly (une alternative à la constante), veuillez vous référer à http://search.cpan.org/perldoc?Readonly –

24

De perlop:

L'opérateur => est synonyme de la virgule sauf que il provoque son gauche opérande à interpréter comme une chaîne si elle commence par une lettre ou tiret de soulignement et est composée uniquement de lettres, chiffres et caractères de soulignement.

Cela comprend des opérandes qui pourraient autrement interprétés comme des opérateurs, constantes, le nombre de chaînes individuelles v-ou appels de fonction. En cas de doute sur ce comportement, l'opérande gauche peut être citée explicitement.

Sinon, l'opérateur => se comporte exactement comme l'opérateur virgule ou d'une liste séparateur d'arguments, selon contexte.

Par exemple:

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

équivaut à:

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

Il n'est pas:

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

L'opérateur => est utile pour documenter la correspondance entre clés et valeurs dans les hachages, et autres éléments associés dans les listes.

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

De PBP:

J'ai trouvé quelques bonnes informations de Perl meilleures pratiques à propos Fat Commas=> et je pense qu'il devrait être agréable de mentionner ici aussi.

Il est préférable de réserver la graisse exclusivement par des virgules pour les choses suivantes: -

Utilisez quand la construction d'un hachage:

my %h = (FOO => 23); 

ou lors du passage arguments nommés à un sous-programme ie. ,

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

ou lorsque c réer une constante:

Readonly my $FOO => "23"; 

Pour plus de détails, voir le chapitre 4: Les valeurs et expressions (Fat) Commas section de Perl meilleures pratiques.