2013-11-21 3 views
1

В моей программе на C++ я хочу выполнить команду perl и прочитать результат, возвращаемый исполнением. Я использую POPEN для этого, но я получаю сообщение об ошибке при выполнении моей команды:Ошибка выполнения команды perl с использованием popen в C++

Команда:

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 работает. –

+0

Я не думаю, что это так, см. Недостающие косые черты в моем примере –

ответ

1

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

1

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

std::string cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" + 
        pattern1 + " START/ .. /" + 
        pattern2+ " END/) && /find/)" 
        " { print \"$_\"}' file"; 

В C++ 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 i, получите ошибку: cmd не найден. Благодарю. –

+0

Я уже избежал символов в моей команде C++. Я отредактировал свой пост и поместил команду, которая работает в командной строке и должна быть переведена на C++. –

+0

Я не могу добавить -std = C++ 0x использовать функцию R(). Я не могу редактировать проект make-файла. –

0

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

cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" + 
      pattern1+ " START/ .. /" + pattern2+ " END/) && /find/)" 
      " { print \"$_\"}' file"; 
stream = popen(cmd.c_str(),"r"); 
Смежные вопросы