2010-11-07 53 views
1

我有参数传递给函数,调用函数不是最初调用它的函数将控制权返回问题。基本上,我正在阅读包含用户名和密码到数组中的文本文件。然后使用foreach循环,我将用户名和密码传递给另一个函数,但是这永远不会返回并且只执行一组arugments;为什么调用Perl的exec内建函数会导致此函数不返回到调用者?

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"); 
} 

基本上,不要担心AddUser函数的作用。它只是运行一些.sh文件,做一些我不关心的东西。目前,我只能从我读入的文件中添加一个用户。此代码只能工作一次,不会返回到“批处理”功能。

我已经尝试添加“返回()”到“ADDUSERS”功能的结束,但这并不能帮助

感谢

回答

11

exec永远不会返回。就像UNIX C中等价的调用系列一样,它将使用您指定的进程替换当前进程。你想要system

从这些网页:

高管:
exec函数执行系统命令永不返回;如果您希望它返回,请使用system而不是exec。它只有在命令不存在时才会失败并返回false,并且直接执行而不是通过系统的命令shell执行。

系统:
不正是同样的事情exec,除了叉子先完成,父进程等待子进程退出。


如果你想捕捉程序的标准输出,你可以使用open -with管变种:

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

下面的成绩单说明了如何搜索包含特定字符串(123在这种情况下)从一个特定的指令(ls -al xx*在这种情况下)行:

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! *踢自己*非常感谢你。如果我想用反引号来执行这个命令呢?我希望能够捕获.sh命令的输出。 :) – microfly7 2010-11-07 12:36:34

+0

@ microfly7,我在Perl中这样做的通常方式是采用开放式管道变体 - 请参阅更新。 – paxdiablo 2010-11-07 12:42:23

+0

*且从不返回*应以斜体显示。 – tchrist 2010-11-07 13:17:16

相关问题