在C ++中使用popen执行perl命令时出错

时间:2013-11-21 10:15:02

标签: c++ perl popen

在我的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”。 但我最初的命令却没有。 我做错了什么。感谢。

3 个答案:

答案 0 :(得分:1)

这是你的转义字符\。当\\变为\时,您必须在C ++字符串中将它们加倍。然后shell就像你在命令行上看到的那样进行处理。即另一轮\\变为\

答案 1 :(得分: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)";

答案 2 :(得分:0)

这有效:

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