Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+;中使用popen执行perl命令时出错+; 在我的C++程序中,我想执行一个Perl COMand并读取执行返回的输出。我使用popen实现这一点,但在执行命令时出现错误:_C++_Perl_Popen - Fatal编程技术网

在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");