【问题标题】:STDIN from bash to perl script从 bash 到 perl 脚本的 STDIN
【发布时间】:2013-12-06 01:30:50
【问题描述】:

我有一个 perl 脚本(myscript.pl)

use strict;
use IO::Handle;

open OUTPUT, '>', "output.txt" or die $!;

STDOUT->fdopen( \*OUTPUT, 'w' ) or die $!;

while (<STDIN>){
print $_;
}

我可以将我在命令行上写的内容粘贴到 output.txt 中

还有

我有一个 bash 脚本:

cat >in.$$ 

cat in.$$> /tmp/msg 

我可以将 in.$$ 中的内容粘贴到 /tmp/msg

我需要使用来自 bash 脚本的标准输入来运行 perl 脚本。

有可能吗?如何实现?

我试过了,虽然我知道这太傻了

cat in.$$> ./myscript.pl
in.$$> ./myscript.pl
in.$$> perl myscript.pl

【问题讨论】:

  • 我可能误解了,但是,./myscript.pl in.$$ 怎么样?

标签: perl bash


【解决方案1】:

要将文件的内容指定为 bash 命令的标准输入,请使用 &lt;

./myscript.pl < in.$$

要将一个命令的输出用作另一命令的输入,请使用“|” (“管道”字符,就像您通过管道将位从一个进程发送到另一个进程)

cat in.$$ | ./myscript.pl
echo foo | ./myscript.pl

【讨论】:

    【解决方案2】:

    在您的 Perl 脚本中,使用 菱形运算符(又名 空文件句柄):

    空文件句柄&lt;&gt; 很特殊:它可以用来模拟sedawk 的行为,以及任何其他采用文件名列表的Unix 过滤程序,对每一行输入执行相同的操作从他们所有人。 &lt;&gt; 的输入要么来自标准输入,要么来自命令行中列出的每个文件。它是这样工作的:第一次评估 &lt;&gt; 时,检查 @ARGV 数组,如果它为空,则将 $ARGV[0] 设置为“-”,打开时会为您提供标准输入。然后将@ARGV 数组作为文件名列表进行处理。

    这是一个例子:

    #! /usr/bin/perl
    # cat command emulator
    
    while ( my $line = <> ) {
        chomp $line;
        say $line;
    }
    

    &lt;&gt; 将获取命令行中列出的每个文件,按顺序打开它们,然后读取每一行,从 STDIN 中拉入行。

    您也可以这样做:

    while ( my $line = <STDIN> ) {
        chomp $line;
        say $line;
    }
    

    它将从 STDIN 读取行,但不会从命令行读取文件。

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多