2009-07-10 5 views
3

Ich habe dieses seltsame Problem mit Perl. Ich versuche, ein externes Programm innerhalb meines Perl-Skripts auszuführen, und dieses externe Programm nimmt String + Wildcard als Parameter. Mein Perl-Programm sieht wie folgt ausWarum funktioniert ein * in meiner in Perl geöffneten Pipe nicht unter 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 

Aus irgendeinem seltsamen Grunde läuft diesen Skript Perl (unter Windows) Aufruf open Funktion mit Fehlern endet:

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

Ich vermuten, dass sie etwas mit dem zu tun * in meinem Befehlsfolge und daher nahm ich es und jetzt ist mein Kommando-String sieht wie folgt aus

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

nun, wenn ich meine Perl-Skript ausführen es wor ks vollkommen in Ordnung. Problem tritt nur auf, wenn Platzhalterzeichen vorhanden sind.

einige Punkte zu beachten:

  1. lief ich den gleichen Befehl mit Wildcard-Zeichen in der gleichen Befehlszeile (wo ich das Perl-Skript bin ausgeführt wird) und es funktioniert völlig in Ordnung ..

  2. Gleicher Befehl funktioniert, wenn ich es in C mit _open Funktion in Windows programmieren.

  3. Problem scheint nur zu sein, wenn Platzhalter * vorhanden ist, zumindest das ist, was ich No

  4. bin zu raten, ich habe diese ..

  5. in Unix nicht versucht

Irgendwelche Hinweise? ??

EDIT: Ich habe festgestellt, dass dies etwas mit ENV zu tun hat. Das Programm, das ich ausführen möchte, verwendet "sqlselect" nur, wenn "*" Platzhalter in Suchzeichenfolge vorhanden ist ... Sowohl find-something-in-somedb als auch sqlselect sind am gleichen Speicherort vorhanden. In diesem Fall kann Perl "find-in-db" und nicht "sqlselect" finden

Tut mir leid, ich merke, dass das ursprüngliche Problem jetzt etwas anderes ist. Etwas mit "ENV" zu tun und nicht mit Wildcard *

Antwort

0

Was passiert, wenn Sie drei Argumente open verwenden?

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

Ein weiterer verwirrender Downvote. Hmmm ... –

+0

Ich werde upvote, um es auszugleichen, aber in der Tat ... downvote und keinen Kommentar zu erklären, warum? – ephemient

+0

@Sinan - Ich hatte einen verwirrenden Downvote ohne Kommentar. –

6

Es wird empfohlen, das 3-Argument Form open

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

zu verwenden, wie, dass die Schale umgeht (die * Expansion durchführen wird).

jedoch auf Windows-Anwendungen oft ihr eigenes quote-Parsing durchführen und * Expansion, so können Sie

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

benötigen oder sogar

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

, wie ich bin nicht sicher, wie genau und wenn Perl Dinge an cmd übergibt.

+0

Dies ist etwas mit $ PATH zu tun, denke ich .. Perl ist in der Lage, "find-in-db", aber nicht "sqlselect" zu finden, wenn beide im selben Netzwerkverzeichnis vorhanden sind. und dieses Netzwerkverzeichnis wird meiner Pfadvariablen in meiner CMD-Eingabeaufforderungssitzung hinzugefügt. – FatDaemon

+0

Es stellte sich heraus, dass es sich um eine stupide Groß- und Kleinschreibung handelte. Verdammt, ich kann nicht dümmer sein .. Das Problem ist sqlselect ist im selben Verzeichnis vorhanden, aber der Dateiname ist "SqlSelect" und Perl scheint das nicht zu mögen. – FatDaemon

+0

Das ist sehr seltsam, denn unter Windows sollte die Suche nach einer Datei mit dem Namen "' sqlselect' '* mit einer Datei namens '' SqlSelect' übereinstimmen ... aber alles ist gut, wenn Sie das Problem lösen konnten. Ich empfehle immer noch, zum 3-Arg offen zu gehen: das ist generell eine gute Angewohnheit. – ephemient

3

Es ist sehr wahrscheinlich, dass Perl den Platzhalter selbst erweitert, was Sie nicht tun möchten. Die Antwort von ephemient vorgesehen ist sehr gut, aber um dies zu debuggen, versuchen Sie diese wirklich einfaches Programm aufrufen:

print join ' ', @ARGV; 

Setzen Sie, dass in eine eigene Datei, nennen Sie es dann von Ihrem ursprünglichen Programm (I genannt Mine argv. pl):

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

Das wird definitiv auf Ihrer Plattform wie Perl Parsing Dinge sagen. Unter Unix wird das * erweitert, um den Dateien im aktuellen Arbeitsverzeichnis zu entsprechen. Ich bin mir nicht sicher über Windows.

Verwandte Themen