在c#中将数据传递给子节点的STDIN

时间:2013-09-30 18:43:59

标签: c#

我是C#和Perl的新手,但我已经用其他语言编程了几年了。但无论如何,我一直在尝试编写一个简单的程序,通过其STDIN将值从C#程序传递到Perl脚本。 C#程序打开Perl脚本就好了,但我似乎无法找到一种方法将'1'传递给它。这样做的最佳方式是什么?我一直在寻找解决方案,但没有运气......

C#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace OpenPerl
{
    class Program
    {
        static void Main(string[] args)
        {
            string path ="Z:\\folder\\test.pl";
            Process p = new Process();
            Process.Start(path, @"1");
        }
    }
}

Perl程序

#!/usr/bin/perl
use strict;
use warnings;
print "Enter 1: ";
my $number=<STDIN>;
if($number==1)
{
    print "You entered 1\n\n";
}

3 个答案:

答案 0 :(得分:1)

试试这个:

my ($number)=@ARGV;

而不是:

my $number=<STDIN>;

来自perldoc“数组@ARGV包含用于脚本的命令行参数。”

答案 1 :(得分:1)

您正在将命令行参数传递给perl脚本,而不是通过Process.Start(字符串,字符串)传递用户输入。

尝试打印perl脚本收到的@ARGV,你应该可以看到1。

答案 2 :(得分:1)

如果你希望perl脚本通过STDIN接收它的输入,那么C#端看起来像这样:

Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;

p.Start();

p.StandardInput.WriteLine("1");

UseShellExecute需要设置RedirectStandardInput,但这可能会阻止perl脚本正常启动。在这种情况下,请设置FileName="<path to perl.exe>"Arguments="<path to script.pl>"