Question

Je voudrais bien comprendre les hachages en Perl. Je suis obligé d'utiliser Perl par intermittence depuis un certain temps, surtout lorsque je dois le faire. Cela concerne principalement le traitement de texte.

Et à chaque fois, je dois faire face à des hachages, ça se gâte. Je trouve la syntaxe très cryptique pour les hachages

Une bonne explication des hachages et des références de hachage, leurs différences, quand ils sont requis, etc. serait très appréciée.

Était-ce utile?

La solution

Un simple hachage est proche d'un tableau. Leurs initialisations se ressemblent même. D'abord le tableau:

@last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Représentons maintenant les mêmes informations avec un hachage (ou tableau associatif):

%last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Bien qu'ils portent le même nom, le tableau @nom_last et le hachage % dernier_nom sont complètement indépendants.

Avec le tableau, si nous voulons connaître le nom de famille d'Archie, nous devons effectuer une recherche linéaire:

my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
  $lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";

Avec le hachage, c'est beaucoup plus direct syntaxiquement:

print "Archie $last_name{Archie}\n";

Disons que nous voulons représenter des informations avec une structure légèrement plus riche:

  • Couperet (nom de famille)
    • Ward (prénom)
    • June (prénom de l'épouse)
  • Flintstone
    • Fred
    • Wilma
  • Bunker
    • Archie
    • Edith

Avant que les références n'arrivent, les hachages de valeurs-clés plates étaient ce que nous pouvions faire de mieux, mais les références le permettent

my %personal_info = (
    "Cleaver", {
        "FIRST",  "Ward",
        "SPOUSE", "June",
    },
    "Flintstone", {
        "FIRST",  "Fred",
        "SPOUSE", "Wilma",
    },
    "Bunker", {
        "FIRST",  "Archie",
        "SPOUSE", "Edith",
    },
);

En interne, les clés et les valeurs de % personal_info sont toutes des scalaires, mais les valeurs constituent un type spécial de scalaires: références de hachage, créées avec {} . Les références nous permettent de simuler " multi-dimensionnelle " hachage. Par exemple, nous pouvons nous rendre à Wilma via

$personal_info{Flintstone}->{SPOUSE}

Notez que Perl nous permet d’omettre les flèches entre les indices, ce qui est équivalent à

.
$personal_info{Flintstone}{SPOUSE}

C’est beaucoup de frappe si vous voulez en savoir plus sur Fred, vous pouvez donc saisir une référence comme une sorte de curseur:

$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";

Parce que $ fred dans l'extrait ci-dessus est un hashref, la flèche est nécessaire. Si vous le laissez mais que vous avez judicieusement activé , utilisez pour vous aider à résoudre ce type d'erreur, le compilateur se plaindra:

Global symbol "%fred" requires explicit package name at ...

Les références Perl sont similaires aux pointeurs en C et C ++, mais elles ne peuvent jamais être nulles. Les pointeurs en C et C ++ nécessitent un déréférencement, tout comme les références en Perl.

Les paramètres de fonction C et C ++ ont une sémantique donnée par valeur: ils ne sont que des copies, les modifications ne sont donc pas renvoyées à l'appelant. Si vous voulez voir les modifications, vous devez passer un pointeur. Vous pouvez obtenir cet effet avec des références en Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

Sans la barre oblique inverse, add_barney aurait obtenu une copie qui a été jetée dès le retour du sous-marin.

Notez également l'utilisation de la "virgule en gras". ( = > ) ci-dessus. Il auto-note la chaîne à sa gauche et rend les initialisations de hachage moins bruyantes syntaxiquement.

Autres conseils

Ce qui suit montre comment utiliser un hachage et une référence de hachage:

my %hash = (
    toy    => 'aeroplane',
    colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";

my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";

Voir aussi perldoc perldsc .

  

Un hachage est un type de données de base en Perl.   Il utilise des touches pour accéder à son contenu.

     

Un hash ref est une abréviation pour un   référence à un hachage. Les références sont   scalaires, c’est des valeurs simples. Il est   une valeur scalaire qui contient   essentiellement, un pointeur sur le réel   hash lui-même.

Lien: différence entre hash et ref hash - Forums de Ubuntu

Une différence existe également dans la syntaxe de suppression. Comme C, perl fonctionne comme ceci pour Hashes:

delete $hash{$key};

et pour les références de hachage

delete $hash_ref->{$key};

Le How to Perl Hash Howto est un excellente ressource pour comprendre les hachages contre les hachages avec références de hachage

Il existe également un autre lien qui contient davantage d'informations sur perl et les références .

Voir perldoc perlreftut qui est également accessible sur la ligne de commande de votre ordinateur.

  

Une référence est une valeur scalaire qui fait référence à un tableau entier ou à un hachage entier (ou à peu près n'importe quoi d'autre). Les noms sont un type de référence que vous connaissez déjà. Pensez au président des États-Unis: un sac de sang et d’os qui dérange et qui dérange. Mais pour parler de lui, ou pour le représenter dans un programme informatique, vous avez uniquement besoin de la chaîne scalaire simple et pratique "Barack Obama".

     

Les références en Perl ressemblent aux noms de tableaux et de hachages. Ce sont des noms internes et privés de Perl, vous pouvez donc être sûr qu’ils ne sont pas ambigus. Contrairement à "Barack Obama", une référence ne fait référence qu’à une chose et vous savez toujours à quoi elle se réfère. Si vous avez une référence à un tableau, vous pouvez en récupérer l'intégralité. Si vous avez une référence à un hachage, vous pouvez récupérer le hachage entier. Mais la référence reste une valeur scalaire simple et compacte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top