假设有一个从控制台输入的列表 <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)
为什么?
编辑:我的原始答案是在假设发布的代码是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严格.