三种Perl读取输入至数组的写法是否功能等价?
嘿,这个问题抓得很准!先给你个明确结论:这三种写法在功能上是完全等价的,最终都会把标准输入(STDIN)的所有行读取到数组@array中,并且自动去掉每一行末尾的换行符。下面给你拆解清楚背后的逻辑:
核心前提:<> 和 <STDIN> 的等价性
在Perl里,当你使用不带任何参数的<>操作符时,它的行为和<STDIN>完全一致——都会从标准输入读取所有行,直到遇到EOF(比如按下Ctrl+D/Unix或Ctrl+Z/Windows)。所以写法里的<STDIN>和<>可以直接互换,这是理解三个写法的基础。
逐个分析写法
写法1:
chomp(my @array = <STDIN>);
执行顺序是:先通过<STDIN>读取所有输入行到一个临时列表,接着把这个列表赋值给刚声明的数组@array,最后chomp作用在@array上,移除每个元素末尾的换行符。写法2:
my @array; chomp(@array = <>);
先声明一个空数组@array,然后把<>(等价于<STDIN>)读取的所有行赋值给@array。这里要注意:Perl里的赋值操作会返回被赋值的内容,所以chomp其实是直接作用在赋值后的@array上,效果和单独写chomp(@array);完全一样,最终也是去掉所有元素的换行符。写法3:
chomp(my @array = <>);
这和写法1几乎是镜像关系——只是把<STDIN>换成了等价的<>,执行逻辑完全一致:先读取所有行赋值给新声明的@array,再用chomp处理数组。
额外细节补充
虽然三个写法功能一致,但有个小细节:chomp本身会返回它去掉的换行符总数,但这三个写法里都没有用到这个返回值,所以对最终结果没有影响。另外,三者都是一次性读取所有输入行到内存,如果输入量极大的话,可能会有内存压力,但这属于另一个话题了。
内容的提问来源于stack exchange,提问作者Jim

