【问题标题】:How does my Perl program get standard input on Linux?我的 Perl 程序如何在 Linux 上获得标准输入?
【发布时间】:2010-09-24 15:53:23
【问题描述】:

我是 Perl 编程的新手,但我对 Linux 有相当多的经验。假设我有以下代码:

while(1) {
    my $text = <STDIN>;
    my $text1 = <STDIN>;
    my $text2 = <STDIN>;
}

现在,主要问题是:Perl 中的 STDIN 是直接从 Linux 机器上的 /dev/stdin 读取还是我必须通过管道将 /dev/stdin 读取到Perl 脚本?

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 你的意思是问/dev/console

标签: linux perl pipe stdin


【解决方案1】:

如果您不向脚本提供任何内容,它会坐在那里等待您输入内容。当你这样做时,它将被放入$text,然后脚本将继续等待你输入一些东西。当你这样做时,它将进入$text1。随后,脚本会再次等你输入一些东西。完成后,输入将进入$text2。然后,整个事情将无限期地重复。

如果您调用脚本为

$ script < input

其中input 是一个文件,脚本会从文件中读取类似于上面的行,然后,当流用完时,将无限期地开始为每个变量分配undef

AFAIK,没有一种编程语言在读取预定义的STDIN(或stdin)文件句柄时需要您调用程序:

$ script < /dev/stdin

【讨论】:

  • 将标准输入重定向到可执行文件的标准输入是完全多余或无意义的。
  • 嗯,我想做的是从磁卡刷卡读取输入,它基本上充当键盘,不幸的是我似乎无法找到 /dev/INPUTDEVICE 文件直接读取,所以我正在尝试其他选项(STDIN).. 有什么建议吗?
  • 找到/dev/INPUTDEVICE。如果这是一个USB设备,连接它并查看dmesg的输出
  • 当我插入它时,我得到 GIT USB READER AS /class/input/input5 .. 我可以去 /sys/class/input/input5 这就像一个永无止境的目录树,我不知道如何处理它。
  • 你知道,告诉我们你想要做什么会为人们省去很多麻烦。您应该在您的问题中添加有关磁卡刷卡的内容。
【解决方案2】:

它直接从 STDIN 文件描述符中读取。如果您运行该脚本,它只会等待输入;如果您将数据通过管道传输给它,它将循环直到所有数据都被消耗完,然后永远等待。

您可能希望将其更改为:

while (my $test = <STDIN>) {
   # blah de blah
}

因此 EOF 将终止您的程序。

【讨论】:

    【解决方案3】:

    默认情况下,Perl 的 STDIN 只是连接到任何标准输入文件描述符。除此之外,Perl 并不真正关心数据的来源和来源。如果您正在从管道读取输出、重定向文件或在终端以交互方式输入,这对 Perl 来说是一样的。

    如果您关心每一种情况并希望以不同的方式处理每一种情况,那么您可以尝试不同的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2016-08-11
      相关资源
      最近更新 更多