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

mic*_*ly7 1 perl return function exec

我在向函数传递参数时遇到问题,而被调用的函数没有将控制权返回给最初调用它的函数.基本上,我正在读取一个文本文件,其中包含用户名和密码到数组中.然后使用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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

pax*_*blo 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);
Run Code Online (Sandbox Code Playgroud)

以下脚本显示了如何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
Run Code Online (Sandbox Code Playgroud)