Comment utiliser un nom de variable perl correctement dans les backticks?
J'ai besoin pour exécuter le code suivant sur un shell bash:
mogrify -resize 800x600 *JPG
Étant donné que la largeur et la hauteur sont des variables, j'ai essayé ceci:
`mogrify -resize $widx$hit *JPG`
Cependant lors de la compilation, j'obtiens l'erreur que Global symbol "$widx" requires explicit package name at getattach.pl line 131.
qui est parce qu'au lieu de $wid et x séparément, le compilateur voit $widx comme une nouvelle variable non déclarée.
J'ai essayé d'insérer des guillemets à l'intérieur de la backticks, mais l'exécution de code s'est arrêté sans aucun message.
Quelle est la bonne manière d'insérer les noms de variables dans les backticks de l'exécution du shell? Peuvent-ils être concaténés?
source d'informationauteur Droidzone
Vous devez vous connecter pour publier un commentaire.
Pour insérer une variable dans toute l'interpolation de chaîne (
qq//
ouqx
ouqr//
), il suffit de faire"this is $foo!"
est suffisante: le nom de La variable (ici:$foo
) est délimitée par le!
qui ne peuvent pas faire partie d'un nom de variable.Il n'est pas si facile lorsque des parties de la chaîne pourrait être une partie du nom de Perl règles de nommage. Exemple:
Perl considère que le nom de la variable à
$insert_genes_hereACTG
. Ce problème peut être résolu parÀ l'aide de curlies de délimiter le nom:
Cela fonctionne toujours et est une solution flexible
De la concaténation de la chaîne:
C'est un peu difficile pour les non-
qq
-citations. Une solution est de créer une variable temporaire qui retient toute la chaîne, et interpole en spécial citations:Une variante de cette approche consiste à utiliser
sprintf
interpolation:Que d'un côté, de nombreux shell interpolation des problèmes peuvent être contournés par pas à l'aide de backticks, et à l'aide de
open
ousystem
à la place (en fonction de si oui ou non vous avez besoin de sortie).Avec
open
:Cette contourne complètement le shell (et plutôt
exec
s directement), afin d'expansion doit être fait manuellement. La même chose vaut poursystem
avec plus d'un argument.Ce problème n'est pas spécifique à backticks. Le problème peut se produire chaque fois que vous interpoler Perl variables dans une chaîne de caractères.
Le problème est que le compilateur Perl ne peut pas savoir où le nom de la variable ("wid"), et le fixe de bits de la chaîne ("x") commence. Donc, il suppose qu'il est à la recherche d'une variable appelée
$widx
- qui n'existe pas.La solution est de mettre le nom de la variable dans
{ ... }
.En plus de l'autre les bonnes réponses, vous pouvez également utiliser le
readpipe
fonction, qui est l'équivalent de backticks et laqx
de l'opérateur. Mais comme une fonction régulière, vous pouvez exercer un plus grand contrôle sur la façon dont les arguments sont interpolées.