从bash到perl脚本的STDIN

mer*_*esi 0 bash perl

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

use strict;
use IO::Handle;

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

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

while (<STDIN>){
print $_;
}
Run Code Online (Sandbox Code Playgroud)

我可以粘贴到output.txt我在命令行上写的东西

我有一个bash脚本:

cat >in.$$ 

cat in.$$> /tmp/msg 
Run Code Online (Sandbox Code Playgroud)

我可以将我所拥有的东西粘贴到/ tmp/msg中

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

是可能的,怎么样?

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

cat in.$$> ./myscript.pl
in.$$> ./myscript.pl
in.$$> perl myscript.pl
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 5

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

./myscript.pl < in.$$
Run Code Online (Sandbox Code Playgroud)

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

cat in.$$ | ./myscript.pl
echo foo | ./myscript.pl
Run Code Online (Sandbox Code Playgroud)


Dav*_* W. 5

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

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

这是一个例子:

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

while ( my $line = <> ) {
    chomp $line;
    say $line;
}
Run Code Online (Sandbox Code Playgroud)

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

您还可以这样做:

while ( my $line = <STDIN> ) {
    chomp $line;
    say $line;
}
Run Code Online (Sandbox Code Playgroud)

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