2009-07-10 5 views
3

私はPerlでこの奇妙な問題を抱えています。私はPerlスクリプトの内部から外部プログラムを実行しようとしています。この外部プログラムはパラメータとしてstring + wildcardを取ります。私はその何かがでやっていることを推測Perlで私のパイプの*がWindowsで動作しないのはなぜですか?

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

:私のPerlプログラムはエラーで終わるopen関数の呼び出し(Windowsで)この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スクリプトを実行すると、それはWOR今、この

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

のように見えます完璧に良い。ワイルドカード文字が存在する場合にのみ問題が発生します。

注意すべきいくつかのポイント:

  1. 私は(私はこのPerlスクリプトを実行しています)同じCMDプロンプトで、ワイルドカード文字と同じコマンドを実行し、それは完全に正常に動作します。..

  2. 同じコマンドは、Windowsで_open関数を使用してC言語でプログラムするときに機能します。

  3. 問題はありません、私は任意の手掛かりが

.. Unixのでこれを試していない?少なくとも、それは私が

  • を推測しています何、ワイルドカード*が存在する場合にのみのようですか??

    EDIT:これはENVと関係があることがわかりました。私が実行しようとしているプログラムは、 "*"ワイルドカードが検索文字列に存在する場合にのみ "sqlselect"を使用します。 find-something-in-somedbとsqlselectは同じ場所にあります。この場合、perlは "sqlselect"ではなく "find-in-db"を見つけることができます

    申し訳ありません私は元の問題が今何か他のものになっていることを認識しています... "ENV"とは何かワイルドカード*

  • 答えて

    0

    3つの引数を使用するとどうなりますか?open

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

    別の困惑するdownvote。うーん... –

    +0

    私はそれをバランスをとるためにupvoteだろうが、確かに... downvoteと理由を説明するコメントはありません? – ephemient

    +0

    @Sinan - 私はあまりにもコメントなしで困惑するdownvoteを持っていた。 –

    6

    すなわち(*拡張を実行する)シェルをバイパスするようopen

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

    の3引数形式を使用することが推奨されます。

    私は正確にどのようにわからないよう、あなたが

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

    あるいは

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

    が必要な場合がありますのでただし、Windowsでは、アプリケーションは多くの場合、自分の引用解析と*拡張を行い、 Perlがものを手放してcmdに渡したとき。

    +0

    これは$ PATHと同じようなものです。Perlは "find-in-db"を見つけることができますが、 "sqlselect"は見つけることができません。両方が同じネットワークディレクトリにある場合です。このネットワークディレクトリは、私のcmdプロンプトセッションのmy path変数に追加されます。 – FatDaemon

    +0

    愚かな大文字小文字の区別が問題であることがわかりました。ダム私はもっと愚かなことはできません..問題は、sqlselectは同じディレクトリに存在しますが、そのファイル名は "SqlSelect"であり、perlはこれを気に入らないようです。 – FatDaemon

    +0

    Windowsでは "' 'sqlselect'" *という名前のファイルが "' SqlSelect' "という名前のファイルと一致するため、非常に奇妙です。私はまだ3-argオープンに移行することをお勧めします:一般的には良い習慣です。 – ephemient

    3

    Perlがワイルドカード自体を拡張している可能性は非常に高いです。あなたはそれを望ましくありません。 ephemientが提供する答えは非常に良いですが、これをデバッグするためには、これは本当に簡単なプログラムを呼び出してみてください。そして、

    print join ' ', @ARGV; 
    

    は、独自のファイルにすることを入れて、あなたの元のプログラムから呼び出す(Iは私がargvを命名しました。 pl):

    これは、Perlがパースする方法を明確にあなたのプラットフォームに伝えます。 Unixでは、*は現在の作業ディレクトリ内のファイルと一致するように展開されます。しかし、Windowsについてはわからない。

    関連する問題