在Perl中实现高级文件读取技巧

9
我正在寻找在Perl中高效读取文件的方法,然后发现了这个非常有趣的一行代码:
my $text = do { local (@ARGV, $/) = $file; <> };

我的问题是:这个到底是如何工作的?通常在读取文件时,您会将$/ = undef,但我不知道这个代码片段是如何实现的。这段小代码非常难以理解。可以简化并解释一下吗?
既然我知道它是如何工作的,让我们变得更加复杂!
请注意,这段代码没有任何实际用途;只是有趣和酷炫。这是一个一行代码,可以同时读取多个文件!
my @texts = map { local (@ARGV, $/) = $_; <> } @files;

1
Perl允许在单个赋值语句中分配多个变量(不知道它的正确称呼):($a, $b, $c) = (1, 2)。这里的$c将会是undef - n0rd
3
那太可怕了。你必须询问它的作用,所以不要复制它。 - Borodin
1
这行代码实际上似乎是Perl代码中常用的一部分。我在不止一个地方看到过它,这也是我提出这个问题的原因。 - tjwrona1992
1
这就是它可怕的地方... ;-) Perl 充满了这些巧妙的小捷径,虽然不好用但却太巧妙了不能不用... - alexis
3
不需要使用 map 处理多个文件。可以使用以下语句将多个文件的内容读取到一个数组中:my @texts = do { local (@ARGV, $/) = @files; <> }; 该语句会将 @files 数组中的所有文件名依次赋值给 @ARGV 数组,并使用 <> 运算符将各个文件的内容读取到一个字符串中,最终将这些字符串存储在 @texts 数组中。 - ikegami
1
(>*o*)> *脑袋炸裂* <(*o*<) - tjwrona1992
1个回答

11
local (@ARGV, $/) = $file;

等同于

local @ARGV = ( $file );
local $/    = undef;

<>会从@ARGV中提到的文件中读取,即从$file中读取。


1
哦,那就说得通了,do {} 只是返回最后一个被评估表达式的值,这将是 <> 的值或文件内容。谢谢 @charoba! - tjwrona1992
@jwrona1992,do 的作用是限制更改 @ARGV$/ 的范围。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接