簡體   English   中英

為什么在我的管道中打開的*不能在Windows上運行?

[英]Why doesn't a * in my pipe open in Perl work on Windows?

我和Perl有這個奇怪的問題。 我試圖從我的Perl腳本中執行外部程序,這個外部程序將字符串+通配符作為參數。 我的Perl程序看起來像這樣

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腳本時,它運行得非常好。 只有存在通配符時才會出現問題。

有些要點需要注意:

  1. 我在相同的cmd提示符(我正在執行這個perl腳本)中使用通配符char運行相同的命令,它運行得很好..

  2. 當我使用Windows中的_open函數在C中編程時,相同的命令有效。

  3. 問題似乎只有當存在通配符*時,至少這是我猜的

  4. 不,我沒有在Unix上試過這個..

任何線索???

編輯 :我發現這與ENV有關。 我嘗試運行的程序僅在搜索字符串中存在“*”通配符時使用“sqlselect”... find-something-in-somedb和sqlselect存在於同一位置。 在哪種情況下perl如何能夠找到“find-in-db”而不是“sqlselect”

對不起,我意識到原來的問題現在變成了別的東西..與“ENV”有關,而不是與Wildcard *有關

建議使用3參數形式的open

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

因為繞過shell(將執行*擴展)。

但是,在Windows上,應用程序通常會執行自己的引用解析和*擴展,因此您可能需要

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

甚至

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

因為我不確定Perl如何以及何時將事情交給cmd

Perl很可能正在擴展通配符本身,你不想這樣做。 ephemient提供的答案非常好,但為了調試這個,嘗試調用這個非常簡單的程序:

print join ' ', @ARGV;

把它放到自己的文件中,然后從原始程序中調用它(我命名為我的argv.pl):

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

這將在您的平台上明確地告訴您Perl如何解析事物。 在Unix上,*被展開以匹配當前工作目錄中的文件。 雖然不確定Windows。

如果你使用三參數open會發生什么?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM