Perl脚本不会多次打印<STDIN>

ale*_*lex -3 bash perl

我有这个Perl脚本:

#!/usr/bin/perl
use strict;
use warnings;

print <STDIN>, "\n";
print <STDIN>, "\n";
print <STDIN>, "\n";
print <STDIN>, "\n";
print <STDIN>, "\n";
Run Code Online (Sandbox Code Playgroud)

我将"Hello"传递给脚本的标准输入:

echo "Hello" | perl test.pl
Run Code Online (Sandbox Code Playgroud)

我希望它能打印"Hello"五次,但它只打印"Hello",然后打印五个换行符.任何人都可以解释为什么这不会按预期工作?

Sin*_*nür 5

print <STDIN>, "\n";
Run Code Online (Sandbox Code Playgroud)

<STDIN>(即readline(STDIN))"在列表上下文中读取,直到到达文件结尾并返回行列表."

在你的程序中,第一个print打印所有读取的行STDIN.

根据定义,没有更多的行来自STDIN,因为<STDIN>在列表上下文中读取了要阅读的所有内容.

如果要从中读取连续五行STDIN并打印它们,则需要:

print scalar <STDIN>;
print scalar <STDIN>;
print scalar <STDIN>;
print scalar <STDIN>;
print scalar <STDIN>;
Run Code Online (Sandbox Code Playgroud)

根据定义,一行以换行符结尾.如果你不删除它,就没有必要再贴上另一个了.

我来说更直观的<STDIN>是,一旦它被传递到脚本中,所表示的值就会保存在内存中

您的程序不包含存储读取输入的说明STDIN.它所做的就是阅读所有可用内容STDIN,打印所有内容并将其丢弃.

如果您想存储从中读取的所有内容STDIN,则必须明确这样做.这就是计算机程序的工作方式:它们完全按照它们的说法完成.想象一下,如果计算机程序根据写作或运行它们的直觉做出不同的事情,将会是一场灾难.

当然,来自的数据STDIN可能是无限的.在这种情况下,将所有内容存储在某个地方并不实际.