Ошибка выполнения команды Perl с использованием popen в C ++

1

В моей программе 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". Но моя первоначальная команда этого не делает. Что я делаю неправильно. Благодарю.

  • 1
    Если вы cout , что строка это выглядит , как вы ожидаете?
  • 0
    Да, это выглядит так, как я хочу, и если я копирую вставляем напечатанную команду в terminl, это работает.
Показать ещё 4 комментария
Теги:
popen

3 ответа

1
Лучший ответ

Это ваши escape-символы \. Вам придется удвоить их в строке C++, так как \\ превращается в \. Затем оболочка выполняет обработку, как вы видите в командной строке. т.е. другой раунд \\ превратился в \.

1

Вам нужно избегать обратной косой черты (добавив больше обратных косых черт!).

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)";
  • 0
    Но если я запускаю в cmd, первая строка вашего вывода работает. И это команда, которую я использовал. Если я использую R, я получаю ошибку: cmd не найден. Благодарю.
  • 0
    Я уже избежал символов в моей команде c ++. Я отредактировал свой пост и поместил команду, которая работает в командной строке и должна быть переведена на c ++.
Показать ещё 2 комментария
0

Это сработало:

cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" +
            pattern1+ " START/ .. /" + pattern2+ " END/) && /find/)"
            " { print \"$_\"}' file";
stream = popen(cmd.c_str(),"r");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню