在C+;中使用popen执行perl命令时出错+; 在我的C++程序中,我想执行一个Perl COMand并读取执行返回的输出。我使用popen实现这一点,但在执行命令时出现错误:
命令:在C+;中使用popen执行perl命令时出错+; 在我的C++程序中,我想执行一个Perl COMand并读取执行返回的输出。我使用popen实现这一点,但在执行命令时出现错误:,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
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 print$\ufile”。
但我最初的命令没有。
谢谢。 < p>这是你的转义字符<代码> \/COD>。你必须在C++字符串中加倍,因为<代码> \代码>变成了代码> > /COD>。然后shell在命令行上进行处理。即,另一轮的<代码> \代码>变成了<代码> \/> > < p>你需要逃离B。反斜杠(通过添加更多反斜杠!) 在C++0x中,您可以使用原始
R“(字符串)”
来避免添加斜杠
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
这个字符串看起来像你期望的那样吗?是的,它看起来像我想要的那样,如果我复制粘贴打印的命令在terminl中,它就工作了。我不认为它工作了,看看我的例子中缺少的斜杠file
看起来像什么?它在命令行执行该命令。所以这个命令很好。但是如果我在cmd中运行,那么E输出的第一行。这是我使用的命令。如果我使用R,我会得到错误:CMD没有找到。谢谢。我已经逃过了C++命令中的字符。我编辑了我的帖子,把命令行的命令放在C++中翻译。我不能添加-STD= C++ +0x来使用R()。函数。我无法编辑makefile的项目。@georgiana_e在这种情况下,您别无选择,只能使用反斜杠选项
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");