gerer $PERL5LIB avec zsh

Par mc, 23 août 2009 23 h 16 min

Je viens de lire ici ce code là:

BASE_PATH=~/code/work/rtgi
for perl_lib in $(ls $BASE_PATH); do
    if [ -f $BASE_PATH/$perl_lib/Makefile.PL ]; then
        PERL5LIB=${PERL5LIB:+$PERL5LIB:}$BASE_PATH/$perl_lib/lib
    fi
done
export PERL5LIB

c’est dommage de ne pas profiter de zsh quand on l’utilise. Transformons:

for perl_lib in $(ls $BASE_PATH); do
done

- utilise une commande externe
- interprete la stdout de ls pour créer un tableau (epic fail en cas de nom de répertoire pourri)

je remplace par:

for perl_lib ( $BASE_PATH/* ) {
}

(utilisant au passage la syntaxe alternative zsh tellement plus jolie)

ensuite …

    if [ -f $BASE_PATH/$perl_lib/Makefile.PL ]; then
        PERL5LIB=${PERL5LIB:+$PERL5LIB:}$BASE_PATH/$perl_lib/lib
    fi

verifie si y’a un Makefile.PL dans le repertoire. Du coup le mieux est de faire l’inverse: chercher tous les Makefile.PL dans les sous-repertoires (non-récursivement)

$BASE_PATH/*/Makefile.PL

puis ne conserver que le dirname ( :h comme head)

for perl_lib ( $BASE_PATH/*/Makefile.PL(:h) ) {
}

reste ca:

PERL5LIB=${PERL5LIB:+$PERL5LIB:}$BASE_PATH/$perl_lib/lib

c’est pas beau mais comment faire avec une chaine ? ca serait tellement plus joli de gérer PERL5LIB avec un tableau pour pouvoir utiliser l’operateur += … et bien zsh permet de faire un tie d’un tableau sur une chaine grace a typeset -T chaine tableau. j’ajoute un U pour laisser a zsh le soin de virer tout doublon.

typeset -UT PERL5LIB perl5lib

maintenant je peux manipuler le tableau perl5lib

# push $PWD:
perl5lib+=$PWD
# unshift $PWD:
perl5lib[1]=( $PWD $perl5lib[1] )

au final, l’expression ci-avant donne donc:

typeset -UT PERL5LIB perl5lib
for f ( $BASE_PATH/*/Makefile.PL(:h) ) { perl5lib+=$f/lib }

enjoy

Related posts:

  1. de vignere en zsh

Laisser un commentaire

Panorama Theme by Themocracy