为什么这个模式与我的程序从STDIN读取的数据不匹配?

man*_*pt1 0 regex perl

假设有一个从控制台输入的列表 <STDIN>

@string = <STDIN>;
Run Code Online (Sandbox Code Playgroud)

现在,我/manu/在我的程序中检查一个模式

foreach (@string)
{
    if(/manu/)
    {
        print $_."\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

代码无法查找模式 /manu/.

但是,当我执行以下操作时,代码完全正常:

chomp(@string = <STDIN>);
Run Code Online (Sandbox Code Playgroud)

为什么?

Sin*_*nür 9

编辑:我的原始答案是在假设发布的代码是OP使用的代码的情况下编写的.更正后更新.

这是我跑步时得到的:

#!/usr/bin/perl

use strict; use warnings;

my @string = <STDIN>;

for (@string) {
    if(/manu/) {
        print "'$_'";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

E:\> t
manu
nana
tada
^Z
'manu
'

请注意Control-Z我用来从Windows上的命令行发出EOF信号(如果你使用*nix shell,你会使用Control-D).

输出仅在程序读取可读取的所有数据时出现STDIN.

请注意后面打印的换行符manu.那是因为我没有chomp输入.这是使用此代码与使用之间的唯一区别

chomp(my @string = <STDIN>)
Run Code Online (Sandbox Code Playgroud)

当您第一次分配<STDIN>到一个数组并迭代它时,您的程序将等待,直到没有更多数据要读取,其内存使用将与接收的数据量成比例.

另一方面,以下程序将处理行:

/manu/ and print while <>;
Run Code Online (Sandbox Code Playgroud)

并且它的记忆使用将与收到的最长线成比例.

上面的行相当于:

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

请注意,您应该始终向脚本添加use strict;及其好友use warnings;.见perldoc严格.