我正在尝试编写一个调用另一个脚本的Perl脚本,该脚本读取整个目录。 我没有得到任何错误,但我也没有得到预期的结果。我屏幕上没有任何内容。
我不需要在屏幕上输出任何内容。我在exec()
语句中调用的脚本应该将每个图像文件读入DIR
目录,并创建一个文件,用于存储从该图像中提取的一些数据。
然后,exec()
语句中的脚本应该循环,直到读入目录中的所有图像。
#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use CGI qw/:standard/;
use CGI::Carp 'fatalsToBrowser';
my $dir = '/FilesToRead/';
my $fichier;
my $ligne;
my $mimetype;
my @listeFichiers;
my $cgi = CGI -> new();
opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);
while (my $ouvRep = readdir(DIR))
{
foreach $fichier (@listeFichiers)
{
exec "v-file ./param.par ./Picture/$fichier -PM_overflow 3000000" or die "Script perl ne s'est pas execute";
}
}
closedir DIR;
答案 0 :(得分:8)
答案 1 :(得分:4)
当您使用exec
时,使用您调用的脚本替换现有的perl进程。请改用system
。
使用exec
,程序在exec
'脚本结束时结束。使用system
,原始perl脚本会在system
'脚本结束后继续。
请查看this question了解更多详情。
答案 2 :(得分:4)
您的代码有两个问题。首先,您使用readdir()
时存在逻辑问题。第一次使用grep()
时,它会读取整个目录并丢弃grep()
不匹配的任何内容。在while
条件下没有其他内容可读,因此它在没有单次迭代的情况下退出循环。
“exec”函数执行系统命令,如果你想让它返回,则永远不会返回 - 使用system“而不是”exec“。
foreach
循环的第一次迭代用exec'd命令替换当前进程。只有v-file
生成它才能获得输出。
我认为你的意思是在这里使用system()
。
答案 3 :(得分:2)
您写道:
opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);
while (my $ouvRep = readdir(DIR))
填充@listeFichiers
后,readdir(DIR)
将根据标量或列表上下文回复undef
或()
。所以,你的while循环将循环零次。
无论如何,你在循环中需要什么?您已经拥有所需的文件列表。
如果您确定需要它,那么closedir
和opendir
之前
opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);
closedir DIR;
opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
while (my $ouvRep = readdir(DIR))
或者您可以在第二个while
循环之前调用rewinddir
。
opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);
rewinddir (DIR);
while (my $ouvRep = readdir(DIR))
答案 4 :(得分:1)
第一次执行exec调用时,您的进程将被替换。永远不会达到循环的第二次(和后续)迭代。
如果你使用系统(或者你想要输出的反引号)而不是exec,它应该做你想要的。你已经给出的具体答案是什么,你不满意吗?
答案 5 :(得分:1)
我想我会用fork做这个,也许用Parallel::ForkManager。对于每个项目,您分叉一个处理它的进程。您可以同时处理多件事。您无需等待system()
完成。如果你只是试图从CGI脚本中触发它(而不是看到结果等),你甚至可能想要调度程序部分的守护程序,以便它自行处理以处理所有内容,并且CGI进程可以在没有它的情况下完成。 / p>
您也可以查看IPC::System::Simple以便轻松进行流程沟通。