11
votes

Comment puis-je passer sur ma variable de boucle Bash à l'interprète Perl?

J'essaie de modifier certains scripts avec une combinaison de bash et de perl. Le problème est que Perl pense que $ index est sa propre variable, qui n'est jamais définie: xxx

est un moyen de faire $ index Portez son manteau de bash dans le Perl One-Liner?


3 commentaires

$ index _ est un nom de symbole valide dans Perl et Bash. Peut-être que vous souhaitez utiliser un autre délimiteur pour le S /// ?


@MOB: Ouais, j'allais changer cela ... essayait de le rendre plus lisible et aiguisé les choses dans le processus: |


@mob: Les délimiteurs de regex ont changé


5 Réponses :


19
votes

Appuyez sur un index d'exportation ; dans la faire boucle. Reportez-vous à $ env. {Index} dans le corps du programme PERL.

Alternativement: utilisez les devis doubles "... $ index ..." pour interpoler la variable de coque dans l'expression qui constitue le corps du programme PERL. Si vous souhaitez développer cette doublure, prenez soin de vous échapper correctement aux expressions Perl, telles que $ sur des noms de variable, et peut-être les backslashes, donc qui sont interprétées par Perl, pas la coque.


1 commentaires

C'est le meilleur, fourni index a été exporté de bash. Vous pouvez le faire avant la boucle ou pendant.



7
votes

Utilisez " au lieu de '. Le bash peut ensuite substituer la variable avant que Perl ne voit.


0 commentaires

3
votes

Utilisez des guillemets doubles au lieu de guillemets simples et $ L'indice sera interpolé avant que la chaîne -E ne soit transmise à Perl.


0 commentaires

2
votes

Voici un exemple de travail (mais pas dans les termes de votre problème - désolé!):

generatep() {
    perl -e '
        $_stem=$ARGV[0];
        $_ctx=$ARGV[1];
        $_role=$ARGV[2];
        $i=$ARGV[3];
        $ct=$i + $ARGV[4];
        while ($i < $ct) {
            print "user=$_stem$i,$_ctx,$_role\n";
            $i++;
        }
    ' ${stem} ${ctx} ${role} ${startix} ${count}
}


4 commentaires

N'est-ce pas susceptible d'interférer avec la manipulation -pi de Perl?


Ça a bien fonctionné pour moi! Vous n'avez pas besoin d'exporter la variable non plus. Cela fonctionne avec les Vars déclarés localement à l'intérieur de votre script.


C'est-à-dire que cette façon de transmettre Vars à Perl n'affecte pas "-PI". Fonctionne bien. Mon utilisation d'une boucle dans cet exemple peut affecter "-pi" mais, c'est juste un par exemple


Mon commentaire était un indice subtil (aussi?) Que vous n'aviez pas correctement aborder la question ...



1
votes

Je suppose que le problème ici est que les globs Bash Shell ne soutiennent pas les gammes. Pour une raison quelconque, je pensais qu'ils l'ont fait. Peu importe, Perl prend en charge les gammes juste bien: xxx

un peu maladroit, mais c'est toute une langue de toute façon.


2 commentaires

Saviez-vous que le bloc peut coincé entre le baiser Eskimo :)? : $ perl -e '...} commence {...'


@ZAID peut-être, mais cela sacrifie beaucoup de logique pour sauver une tranche bouclée de dactylographie. = P