2009-07-10 29 views
3

我遇到了Perl的这个奇怪的问题。我试图从我的Perl脚本中执行一个外部程序,并且这个外部程序以字符串+通配符作为参数。我的Perl程序看起来像这样为什么我的管道中的*在Perl中不能在Windows上打开?

my $cmd_to_run = 'find-something-in-somedb myname* |' 
open(procHandle, $cmd_to_run); # I am using open because I want to 
           # parse the output using pipes 

出于某种奇怪的原因,运行此Perl脚本(在Windows)调用open功能,错误结束:

'sqlselect' is not recognized as an internal or external command 

我猜测它的东西用做*出现在我的命令字符串,所以我删除了它,现在我命令字符串看起来像这样

my $cmd_to_run = 'find-something-in-somedb myname|' 

现在,当我跑我的Perl脚本它活像KS非常好。只有当通配符存在时才会出现问题。

几点需要注意:

  1. 我跑了通配符字符相同的命令,在相同的命令提示符(我在哪里执行这个perl脚本),它运行完美..

  2. 当我在Windows中使用_open函数在C中进行编程时,相同的命令有效。

  3. 问题似乎是,只有当通配符*存在,至少这是我猜

  4. 不,我还没有尝试过的Unix这个..

任何线索? ??

编辑:我发现这与ENV有关。我试图运行的程序仅在搜索字符串中存在“*”通配符时才使用“sqlselect”... 这两个find-something-in-somedb和sqlselect都出现在相同的位置。在这种情况下,perl能够找到“find-in-db”,而不是“sqlselect”

对不起,我认识到原来的问题现在变成了别的东西..与“ENV”有关的事情,而不是与通配符*

回答

0

如果使用三参数open会发生什么?

open my $procHandle, '-|', 'find-something-in-somedb myname*' 
    or die "Cannot open pipe: $!"; 
+0

另一个令人费解的downvote。嗯... – 2009-07-10 21:23:47

+0

我会upvote来平衡它,但的确... ... downvote和解释为什么没有评论? – ephemient 2009-07-10 21:46:51

6

建议使用的open

open(procHandle, '-|', 'find-something-in-somedb', 'myname*'); 

3参数形式作为绕过所述壳(其将执行*扩张)。

然而,在Windows,应用程序通常执行他们自己的报价,解析和*扩张,所以你可能需要

open(procHandle, '-|', 'find-something-in-somedb', '"myname*"'); 

甚至

open(procHandle, '-|', 'find-something-in-somedb "myname*"'); 

因为我不知道究竟是如何与当Perl把事情交给cmd

3

Perl很可能扩展了你自己不想做的通配符本身。通过ephemient提供的答案是非常好的,但为了调试这个问题,尝试调用这个非常简单的程序:

print join ' ', @ARGV; 

它放入自己的文件,然后从原始程序调用它(我将其命名argv的。 pl):

my $cmd_to_run = './argv.pl myname* |' 
open(procHandle, $cmd_to_run); 

这将在您的平台上明确地告诉您Perl如何解析事物。在Unix上,*被展开以匹配当前工作目录中的文件。虽然不确定Windows。

相关问题