为什么调用Perl的exec内置会导致此函数不返回其调用者?

时间:2010-11-07 12:24:36

标签: perl function exec return

我遇到了将参数传递给函数而被调用函数没有将控制权返回给最初调用它的函数的问题。基本上,我正在读取一个文本文件,其中包含用户名和密码到数组中。然后使用foreach循环我将用户名和密码传递给另一个函数,但这永远不会返回,只执行一组arugments;

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文件,它做了一些我不关心的东西。目前,我只能从我读过的文件中添加一个用户。此代码只能运行一次,不会返回“批处理”功能。

我尝试将'return()'添加到'AddUsers'函数的末尾,但这没有帮助

由于

1 个答案:

答案 0 :(得分:11)

exec永远不会回来。与UNIX C中的等效调用系列一样,它将当前进程替换为您指定的进程。你想要system

从这些页面:

  

exec:
exec函数执行系统命令,永不返回;如果您想要返回,请使用system代替exec。它失败并仅在命令不存在时返回false并且它是直接执行而不是通过系统的命令shell执行。

     

system:
exec完全相同,只是首先执行fork,父进程等待子进程退出。


如果要捕获程序的标准输出,可以使用open - with-pipe变体:

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