报错的原因是 语法写错了——Perl 的 foreach 语法需要把列表放在圆括号里,并且用尖括号读取句柄时要写完整:
perl
复制
foreach $line (<STDIN>) { # ← 圆括号 + <STDIN>
print $line;
}
为什么要放在()里面
对比 while 循环的标量上下文行为:
perl
while (my $line = <STDIN>) { ... } # 标量上下文:逐行读取
while 条件句是标量上下文:每次读取一行
foreach + 圆括号是列表上下文:一次性读取所有行
考虑以下错误写法:
perl
foreach $line <STDIN> { ... } # 语法错误!
Perl 解析器会困惑:
<STDIN> 是否表示文件句柄?
是否遗漏了比较运算符(如 foreach $line < 10)?
圆括号消除了这种歧义。
foreach my $line (<STDIN>) {
print $line;
}
while (my $line = <STDIN>) {
print $line;
}
关键点:
使用 foreach 时必须加 () 包裹列表
<STDIN> 在列表中会一次性吞掉所有输入(慎用大文件)
处理大文件优先用 while 循环