从bash到perl脚本的STDIN

时间:2013-12-05 16:32:10

标签: perl bash

我有一个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 

我可以将我所拥有的内容粘贴到/ tmp / msg

我需要使用来自bash脚本的stdin运行perl脚本。

是否可能以及如何?

我试过,尽管我知道它太傻了

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

2 个答案:

答案 0 :(得分:5)

要指定文件的内容作为bash命令的标准输入,请使用<

./myscript.pl < in.$$

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

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

答案 1 :(得分:4)

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

  

null文件句柄<>很特殊:它可以用来模拟sedawk的行为,以及任何其他带有文件名列表的Unix过滤器程序,对于来自所有这些输入的每一行输入都是相同的。 <>的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次评估<>时,检查@ARGV数组,如果它是空的,$ARGV[0]设置为“ - ”,打开时为您提供标准输入。然后将@ARGV数组作为文件名列表处理。

以下是一个例子:

#! /usr/bin/perl
# cat command emulator

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

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

你也可以这样做:

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

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