2010-11-07 2 views
1

J'ai des problèmes avec la transmission d'arguments à une fonction et la fonction appelée ne retourne pas le contrôle à la fonction qui l'a initialement appelée. Fondamentalement, je lis dans un fichier texte qui contient des noms d'utilisateur et des mots de passe dans un tableau. Ensuite, en utilisant une boucle foreach, je passe le nom d'utilisateur et le mot de passe à une autre fonction mais cela ne retourne jamais et ne s'exécute que pour un ensemble de règles;Pourquoi appeler l'exécutif de Perl fait que cette fonction ne retourne pas à son appelant?

sub batch { 
    open(my $in, "<", "$ARGV[0]") or die "Can't open $ARGV[0]: $!"; 
#Read file contents into an array. 
@listOfUsers = <$in>; 
foreach $listOfUsers (@listOfUsers) { 
    #Regex to check if txt file conforms to correct syntax. 
    if ($listOfUsers !~ /([a-zA-Z]{1}[a-zA-Z0-9]{3,40})\s[a-zA-Z]{1}[a-zA-Z0-9]{3,40}/) { 
    print "Please ensure that line $listOfUsers in $ARGV[0] is of the following syntax:\n"; 
    print "\n<USERNAME> <PASSWORD>\n"; 
    exit(0); 
    } else { 
    #split string and call AddUser function 
    my ($username, $password) = split(" ",$listOfUsers); 
    AddUser($username, $password); 
    } 
} 
} 



sub AddUser { 
exec("infacmd.sh createUser -dn domain -un user -pd pass -hp domain:80 -nu " . $_[0] . " -np " . $_[1] . " -nf test"); 
} 

Fondamentalement, ne vous inquiétez pas de ce que fait la fonction AddUser. Il fonctionne juste un fichier .sh qui fait des choses que je ne suis pas concerné. Actuellement, je ne peux ajouter qu'un utilisateur du fichier que j'ai lu. ce code ne fonctionne qu'une seule fois et ne retourne pas à la fonction 'batch'.

J'ai essayé d'ajouter « retour() » à la fin de la fonction « AddUsers », mais cela ne suffit pas

Merci

Répondre

11

exec ne retourne jamais. Comme la famille d'appels équivalente dans UNIX C, elle remplace le processus en cours par celui que vous spécifiez. Vous voulez system.

de ces pages:

exec:
La fonction exec exécute une commande de système et ne retourne jamais; utilisez system au lieu de exec si vous voulez le retourner. Il échoue et renvoie false uniquement si la commande n'existe pas et est exécutée directement au lieu de via le shell de commande de votre système.

système:
fait exactement la même chose que exec, sauf qu'une fourche est fait en premier, et le processus parent attend que le processus enfant pour quitter.


Si vous voulez capturer la sortie standard d'un programme, vous pouvez utiliser la variante open -avec-pipe:

open (HNDL, "myprogram |") || die "Cannot execute."; 
while (<HNDL>) { 
    # Do something with each line. 
} 
close (HNDL); 

La transcription ci-dessous montre comment vous pouvez effectuer une recherche pour les lignes contenant une chaîne spécifique (123 dans ce cas) d'une commande spécifique (ls -al xx* dans ce cas):

pax> ls -al xx* 
    -rw-r--r-- 1 pax None 10 2010-06-13 19:51 xx 
    -rw-r--r-- 1 pax None 123 2010-05-05 23:39 xx.py 

pax> cat qq.pl 
    open (HNDL, "ls -al xx* |") || die "Cannot execute."; 
    while (<HNDL>) { 
     if (/123/) { 
      print; 
     } 
    } 
    close (HNDL); 

pax> perl qq.pl 
    -rw-r--r-- 1 pax None 123 2010-05-05 23:39 xx.py 
+0

arghhhh !!! * coups de pied auto * merci à vous deux. Que faire si je veux utiliser des backticks pour exécuter cette commande à la place? Je veux être en mesure de capturer la sortie de la commande .sh. :) – microfly7

+0

@ microfly7, la façon habituelle de faire cela en Perl est avec la variation open-with-pipe - voir la mise à jour. – paxdiablo

+0

Le * et ne revient jamais * doit être en italique. – tchrist

Questions connexes