В моей программе c++ я хочу выполнить команду perl и прочитать результат, возвращаемый исполнением. Я использую popen для этого, но я получаю сообщение об ошибке при выполнении моей команды:
Команда:
string cmd = "perl -ne 's/^\\S+\\s//; if ((/" +
pattern1+ " START/ .. /" + pattern2+ " END/) && /find/)"
" { print \"$_\"}' file";
stream = popen(cmd.c_str(),"r");
Если я выполняю эту команду в командной строке, она работает, но в c++ я получаю эту ошибку:
Search pattern not terminated at -e line 1.
Команда, которая работает в командной строке, в c++ я уже избежал "\" и "":
perl -ne 's/^\\S+\\s//; if ((/aaa START/ .. /bbb END/) && /find/) { print "$_"}' file
Если я выполню эту команду, она будет работать: "perl -ne print $ _ file". Но моя первоначальная команда этого не делает. Что я делаю неправильно. Благодарю.
Это ваши escape-символы \
. Вам придется удвоить их в строке C++, так как \\
превращается в \
. Затем оболочка выполняет обработку, как вы видите в командной строке. т.е. другой раунд \\
превратился в \
.
Вам нужно избегать обратной косой черты (добавив больше обратных косых черт!).
std::string cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" +
pattern1 + " START/ .. /" +
pattern2+ " END/) && /find/)"
" { print \"$_\"}' file";
В С++ 0x вы можете использовать необработанные R"(strings)"
чтобы избежать добавления косой черты. Компилировать с GCC как
g++ -std=c++0x -Wall popen.cpp
пример:
std::string cmd_raw = R"(perl -ne 's/^\\S+\\s//; if ((/)" +
pattern1 + R"( START/ .. /)" +
pattern2 + R"( END/) && /find/))"
R"( { print \"$_\"}' file)";
Это сработало:
cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" +
pattern1+ " START/ .. /" + pattern2+ " END/) && /find/)"
" { print \"$_\"}' file";
stream = popen(cmd.c_str(),"r");
cout
, что строка это выглядит , как вы ожидаете?