我有一个字符串,其中包含许多带有白色空格的文字,如:
String str = "abc xyz def";
我现在使用C#将此字符串作为命令行参数传递给perl文件,如下所示:
Process p = new Process();
p.StartInfo.FileName = "c:\\perl\\bin\\perl.exe";
p.StartInfo.Arguments = "c:\\root\\run_cmd.pl " + str + " " + text_file;
在run_cmd.pl文件中,我有以下内容:
open FILE, ">$ARGV[1]" or die "Failed opening file";
print FILE $ARGV[0];
close FILE;
在打印时,我只能将字符串的一部分,即“abc”复制到text_file中,因为Perl会将其解释为单个参数。
我的问题是,我是否可以将整个字符串复制到包含空格的文本文件中?
答案 0 :(得分:2)
如果您希望将空格分隔的参数视为单个参数,对于大多数程序,您需要用" "
例如run_cmd.pl "abc xyz def" filename
尝试
p.StartInfo.Arguments = "c:\\root\\run_cmd.pl \"" + str + "\" " + text_file;
旁注:
我不知道windows,但是在Linux中有一个number of arguments and maximum length of one argument limit所以你可能要考虑以其他方式传递字符串,例如从tmp文件中读取它。
答案 1 :(得分:2)
这有点像黑客,但
$ARGV[$#ARGV]
将是@ARGV中的最后一项,
@ARGV[0 .. ($#ARGV - 1)]
将是之前的一切。
答案 2 :(得分:1)
它不是perl - 它是你的外壳。你需要在参数周围加上引号:
p.StartInfo.Arguments = "c:\\root\\run_cmd.pl '" + str + "' " + text_file;
如果text_file
来自用户输入,您也可能想引用它。
(您还需要转义str
或text_file
中的任何现有引号;我不确定在Windows中转义引用的正确方法是什么?
答案 3 :(得分:0)
我建议你看一下管道打开。请参阅http://search.cpan.org/~jhi/perl-5.8.0/pod/perlopentut.pod#Pipe_Opens和http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC
这些允许您发送与被叫代码可以处理的数据一样多的数据,并且不受操作系统命令行的限制。