2017-04-12 3 views
1

J'essaie d'exécuter une commande de recherche à distance, mais je dois lui transmettre des variables locales dont la valeur provient des arguments de la ligne de commande de l'utilisateur. Mais, je reçois une erreur "variable indéfinie". Je suis en train de faire quelque chose comme:Utilisation de variables perl locales dans la commande shell

my $ssh = Net::OpenSSH->new($host); 
#I am getting a part of the $path and $pattern from command line 
#I have to look for $pattern at the $path 
my @files = $ssh->capture(q(find $path -name $pattern)); 

Cette commande fonctionne bien quand je donne le chemin exact et le modèle, mais je reçois erreur quand je remplacerai avec des variables.

Répondre

2
q(find $path -name $pattern) 

Ceci est la chaîne littérale find $path -name $pattern, signes dollar et tout.

Perl a plusieurs types de guillemets différents. "" va interpoler les variables (ie les remplacer par leurs valeurs), '' ne le fera pas. q() est une autre façon d'écrire ''. Vous voulez qq(). Pour plus d'informations, voir Quote and Quote-Like Operators in perlop.

+0

oui merci pour votre réponse. Maintenant, il ne me donne pas une erreur mais il est incapable d'obtenir les modèles correspondants. C'est-à-dire que je reçois un "find: no match" lorsque je stocke le même motif dans une variable mais qu'il s'exécute lorsque j'utilise la valeur de pattern directement dans la commande. Merci encore :) – emma

+0

my $ pattern = "* 40786 *"; #Ceci s'exécute lorsque j'écris mes @files = $ ssh-> capture2 (qq (find/u1/temp -name "* 40786 *")); #but retourne non trouvé quand j'utilise la variable $ pattern Désolé si c'est une question idiote. Je suis nouveau à Perl et je n'ai pas trouvé d'explication ailleurs. – emma

+0

@emma Ça devrait marcher. Sans le code environnant, je ne peux pas vous dire ce qui ne va pas. Je vous suggère de poser une nouvelle question et de fournir un programme complet qui ne fonctionne pas. – Schwern