2010-04-18 5 views
3

J'ai lu le document perl, mais je n'arrive pas à comprendre les hachages. J'essaie de trouver si une clé de hachage existe, et si oui, comparez sa valeur. La chose qui me déroute est que mes recherches disent que vous trouvez si une clé existe par if (exists $files{$key}), mais que $files{$key} donne aussi la valeur? le code je travaille est:hachages perl - comparer les clés et les valeurs

foreach my $item(@new_contents) { 
    next if !-f "$directory/$item"; 
    my $date_modified = (stat("$directory/$item"))[9]; 

    if (exists $files{$item}) { 
     if ($files{$item} != $date_modified { 
      $files{$item} = $date_modified; 
      print "$item has been modified\n"; 
     } 
    } else { 
     $files{$item} = $date_modified; 
     print "$item has been added\n"; 
    } 
} 

Répondre

9

$files{$key} va en effet retourner la valeur de cette clé. Mais que se passe-t-il si cette valeur est fausse dans un contexte booléen, comme 0 ou '' (une chaîne vide)?

Tenir compte d'un hachage comme ceci:

my %foo = (red => 42, blue => 0, green => '', yellow => undef); 

Si je devais dire if ($foo{blue}) la condition échouerait. Même si blue existe dans le hachage, la condition est fausse car la valeur de $foo{blue} est zéro. Idem avec les clés green et yellow - les chaînes vides et undef sont des valeurs fausses.

Sans exists, il n'y aurait pas de moyen (facile) de déterminer si une clé de hachage est réellement là et si sa valeur est fausse, ou si elle n'y est pas du tout. (Vous pouvez appeler keys, puis grep la liste qui en résulte, mais c'est ridicule.)

Votre code me semble parfaitement bien. Vous utilisez correctement exists.

+0

@friedo Je me suis rendu compte que c'était des erreurs de syntaxe qui me donnaient des problèmes, mais merci pour cette clarification, rend les choses beaucoup plus claires! –

Questions connexes