Re: grep

トップ ページ

このメッセージに返信
著者: Edgar Bonet
日付:  
To: Liste Guilde
題目: Re: grep
Le jeudi 14 avril, anne aublanc a écrit :
> bon, j'ai écrit fait cela sans grep...
> my $is_there = "";
> my $elt = "";
> foreach $elt (@num_phone) {
>    if ($elt eq $x_phone) {
>         $is_there = "x";
>         last;
>      }
> }
> if (  $is_there eq "" ) {
>   push ( @num_phone, "$x_phone");
> }

>
> un peu lourd !!!


Oui. Je crois qu'à vouloir utiliser un tableau tu fais fausse route. À
ta place je stockerais plutôt les numéros en tant que clés d'un hachage
(un tableau associatif). Ça évite automatiquement les doublons : tu n'as
donc pas à tester la présence d'un numéro avant de l'ajouter. Comme
valeurs associées aux clés je mettrais juste 1. Cette utilisation des
tableaux associatifs est l'équivalent des ensembles de Python. Voici un
exemple :

#!/usr/bin/perl

# Initialisation du hachage avec deux numéros : "123" et "456".
%num_phone = (
    "123" => 1,
    "456" => 1
);


# Je lis des numéros sur stdin.
while (chomp($x_phone = <>)) {

    # Pour savoir si un numéro est présent, $num_phone{$x_phone}
    if ($num_phone{$x_phone}) {
        print "$x_phone est dans la liste\n";
    } else {
        print "$x_phone n'est pas dans la liste\n";
    }


    # Pour ajouter $x_phone, pas la peine de tester s'il y est déjà
    $num_phone{$x_phone} = 1;
}


# Pour retrouver la liste des numéros : keys(%num_phone).
# Attention : ça sort dans le désordre
print "Liste des numéros:\n";
foreach $num (sort keys %num_phone) {
    print "\t$num\n";
}


> bref, j'ai des grep et des expressions régulières de partout!


Pourquoi tu utilises des expression régulières alors que tu veux des
comparaison littérales ? L'opérateur de comparaison de chaînes est eq.

> et les caractères spéciaux... Ils ne sont pas amis!


Les caractères spéciaux sont indispensables quand ce que tu recherches
n'est pas une comparaison littérale.

Le jeudi 14 avril, anne aublanc a écrit :
> trouvé => quotemeta


Mauvaise solution. N'utilise pas les expression régulières si ce n'est
pas ce dont tu as besoin.

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org