Perles de Perl

Accéder facilement aux paramètres de la Query string en CGI

Pour plus de confort, il est agréable de pouvoir accéder à tous les paramètres qui ont été passés en Query string (type /cgi-bin/monscript.cgi?param1=valeur&param2=valeur) sous la forme d'un tableau de hachage. Pour ce faire, mettez ceci au début de votre script monscript.cgi :

if(length($ENV{'QUERY_STRING'}) > 0){
    $buffer = $ENV{'QUERY_STRING'};
    @pairs = split(/&/, $buffer);

    foreach $pair (@pairs){
        ($name, $value) = split(/=/, $pair);
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $params{$name} = $value;
    }
}

Vos paramètres sont désormais accessibles via le hachage %params ($params{'param1'}, $params{'param2'} etc.).

Un équivalent du 'for i in ...' de Bash en Perl

Tout bon sysadmin ayant découvert la boucle for i in ... de Bash sait qu'il n'existe pas plus pratique et plus rapide pour exécuter des instructions en boucle. Les boucles de type "for" et "foreach" existent bien entendu en Perl, cependant leur syntaxe de base n'est pas aussi concise que celle de Bash. Il est tout de même possible d'écrire un équivalent à l'aide de l'opérateur qw afin d'éviter de devoir déclarer une liste temporaire pour l'occasion.

En Bash :

for i in tata titi toto tutu; do
    echo $i
done

En Perl, la manière "propre" (et donc, longue) :

my @liste = ("tata", "titi", "toto", "tutu");

foreach $i (@liste){
    print "$i\n";
}

En Perl, la manière courte :

foreach my $i (qw(tata titi toto tutu)){
    print "$i\n";
}

Substitution "in place" à la sed en ligne de commande

marc@plop:~% cat uname.txt
Linux plop 2.6.24-19-generic #1 SMP Wed Aug 20 22:56:21 UTC 2008 i686 GNU/Linux

marc@plop:~% perl -pi -e 's/Linux/Linusque/g' uname.txt

marc@plop:~% cat uname.txt
Linusque plop 2.6.24-19-generic #1 SMP Wed Aug 20 22:56:21 UTC 2008 i686 GNU/Linusque

Pour créer une copie de l'original suffixée au passage, ajoutez le suffixe souhaité après l'option -i :

marc@plop:~% perl -pi.bak -e 's/Linux/Linusque/g' uname.txt

Cette commande modifiera le fichier uname.txt comme la précédente, en créant au préalable une copie du fichier uname.txt.bak ; vous pouvez suffixer la copie par ce que vous voulez, pas nécessairement .bak ;)

docs.soolbox.net: SysadminTips/Perl (last edited 2008-12-24 10:06:55 by MarcFalzon)