Спасибо за ответы, я пришел к выводу, что допустил большую ошибку: снова коснулся Perl: потрачены часы времени, чтобы выяснить, что это не может быть сделано должным образом.Perl использует другой способ разделения параметров командной строки, чем все другие приложения, использующие MS stdlib (что является стандартным для win32).Из-за этого некоторые параметры командной строки, которые должны были интерпретироваться как аргумент командной строки signle, perl может интерпретироваться как более чем один аргумент.Это означает, что все, что я пытаюсь сделать, это пустая трата времени из-за такого некорректного поведения в perl.Невозможно выполнить эту задачу правильно, если я 1) не могу получить доступ к исходной командной строке как есть и 2) perl не разделяет аргументы командной строки правильно.как простой тест:
script.pl """test |test"
на win32 будет неправильно интерпретировать командную строку как:
ARGV=['"test', '|test']
Принимая во внимание, что правильный «ответ» на окнах должен быть
ARGV=['"test |test']
Я использовал Perl ActiveState, я пробовал также последнюю версию клубничного Perl: оба отстой.Похоже, что Perl, который поставляется с msys, работает должным образом, скорее всего потому, что он был построен против mingw вместо времени выполнения cygwin? ..
Проблема и причина в perl состоит в том, что у него глючный синтаксический анализатор строк cmd, и он выиграл 'не работает на окнах Неважно, что Cygwin поддерживает или нет.У меня есть простой случай, когда переменная окружения (которую я не могу контролировать) расширяется до
perl gcc.pl -c "-IC:\ffmpeg\lib_avutil\" rest of args
Perl видит, что у меня есть только два аргумента: -c и '-IC: \ ffmpeg \ lib_avutil "Остальные аргументы«тогда как любая соответствующая реализация Windows получает вторую строку команды cmd в виде: '-IC: \ ffmpeg \ lib_avutil \', это означает, что perl - огромная куча мусора для моего простого случая, потому что она не предоставляет адекватных средств для доступа к cmdСтроковые аргументы. Мне лучше использовать boost :: regex и выполнять весь мой синтаксический анализ непосредственно в c ++, по крайней мере я никогда не буду делать глупых ошибок, таких как ne и! = для сравнения строк и т. д. Правила экранирования Windows для аргументов командной строкидовольно странно, но они стандартны для Windows, и Perl по какой-то странной причине не хочет следовать правилам ОС.