3

私は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. 同じコマンドプロンプト(このperlスクリプトを実行している場所)でワイルドカード文字を使用して同じコマンドを実行しましたが、完全に正常に機能します。

  2. Windowsで_open関数を使用してCでプログラムした場合も、同じコマンドが機能します。

  3. 問題はワイルドカード*が存在する場合にのみ発生するようです、少なくともそれは私が推測していることです

  4. いいえ、Unixでは試していません。

手がかりはありますか?

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

申し訳ありませんが、元の問題が現在別のものであることが判明しています。ワイルドカードではなく「ENV」に関係するもの*

4

3 に答える 3

6

openの 3 引数形式を使用することをお勧めします。

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

それはシェルをバイパスするためです(*展開を実行します)。

ただし、Windows では、アプリケーションが独自の引用符の解析と*展開を実行することが多いため、必要になる場合があります。

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

あるいは

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

Perl がいつ、どのようにcmd.

于 2009-07-10T20:17:08.047 に答える
0

three-argument を使用するとどうなりますopenか?

open my $procHandle, '-|', 'find-something-in-somedb myname*'
    or die "Cannot open pipe: $!";
于 2009-07-10T20:16:32.277 に答える