2009-07-10 2 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. Я побежал ту же команду с подстановочным полукоксом, в той же строке CMD (где я уверен, выполнение этого сценария Perl), и это работает прекрасно ..

  2. Такая же команда работает, когда я программирую ее на C, используя функцию _open в Windows.

  3. Проблема, кажется, только тогда, когда групповой символ * присутствует, по крайней мере, это то, что я угадал

  4. Нет, я не пробовал это в Unix ..

Любые подсказки? ??

EDIT: Я нашел, что это как-то связано с 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

Еще один загадочный нижний план. Хммм ... –

+0

Я поднимусь, чтобы сбалансировать это, но действительно ... downvote и никаких комментариев, объясняющих почему? – ephemient

+0

@Sinan - У меня был озадачивающий нисходящий поток без комментариев. –

6

Рекомендуется использовать 3-аргумент формы open

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

как обходит оболочку (которая будет выполнять * расширение).

Однако, на Windows, приложения часто выполняют свои собственные цитаты-синтаксический анализ и * расширения, поэтому вам может понадобиться

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

или даже

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

, как я не знаю точно, как и когда Perl передает вещи в cmd.

+0

Это как-то связано с $ PATH, я думаю .. Perl может найти «find-in-db», но не «sqlselect», если оба они присутствуют в одном сетевом каталоге. и этот сетевой каталог добавляется к моей переменной пути в моем сеансе подсказки cmd. – FatDaemon

+0

Выяснилось, что это была глупая проблема с делом. Черт, я не могу быть более глупым. Проблема заключается в том, что sqlselect присутствует в том же каталоге, но его имя файла - «SqlSelect», и perl, похоже, не нравится. – FatDaemon

+0

Это очень странно, потому что в Windows поиск файла с именем «sqlselect'» * должен * соответствовать файлу с именем «SqlSelect» ... но все хорошо, если вам удалось решить проблему. Я по-прежнему рекомендую перейти к открытию 3-arg: это хорошая привычка в целом. – ephemient

3

Очень вероятно, что Perl расширяет сам шаблон, который вы не хотите делать. Ответ предоставляется ephemient очень хорошо, но для того, чтобы отладить это, попробуйте позвонить это действительно простую программе:

print join ' ', @ARGV; 

Положите в отдельный файл, а затем вызвать его из оригинальной программы (я назвал мой ARGV. pl):

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

Это окончательно расскажет вам о вашей платформе, как Perl разбирает вещи. В Unix * расширяется для соответствия файлам в текущем рабочем каталоге. Однако не уверен в Windows.

Смежные вопросы