如果这个问题听起来很简单,我深表歉意,我的目的是深入了解这个(这些?)特定运算符是如何工作的,我无法在 perldocs 中找到令人满意的描述(它可能存在于某个地方,我只是不能为我的一生找到它)
特别是,我有兴趣知道是否
一种)<>
b)<*>
或任何全局和
C)<FH>
本质上相似或不同,以及它们如何在内部使用。
我构建了自己的测试函数来对此有所了解(如下所示)。我仍然没有完全理解(我的理解甚至可能是错误的),但这就是我得出的结论:
<>
- 在标量上下文中:读取正在读取的“当前文件”的下一行(在 @ARGV 中提供)。问题:这似乎是一个非常特殊的场景,我想知道为什么会这样,以及它是否可以概括。还有什么是正在读取的“当前文件”?它在文件句柄中吗?什么是柜台?
- 在列表上下文中:将@ARGV 中的所有文件读入一个数组
<list of globs>
- 在标量上下文中:在当前文件夹中找到的与 glob 匹配的第一个文件的名称。问题: 为什么是当前文件夹?我该如何改变?改变这种情况的唯一方法是像 < /home/* > 吗?
- 在列表上下文中:与当前文件夹中的 glob 匹配的所有文件。
<FH>
分配给变量时似乎返回 undef 。 问题:为什么是undef?它没有类型吗?当 FH 不是裸字文件句柄时,这种行为是否类似?
一般问题:在执行期间处理 <> 的值和其他值的是什么?在标量上下文中,是否返回了任何类型的引用,或者我们分配它们的变量是否与任何其他非引用标量相同?
我还注意到,即使我按顺序分配它们,每次都会重置输出。即我会假设当我这样做时
$thing_s = <>;
@thing_l = <>;
@thing_l
将丢失第一个项目,因为它已经由$thing_s
. 为什么不是这样?
用于测试的代码:
use strict;
use warnings;
use Switch;
use Data::Dumper;
die "Call with a list of files\n" if (@ARGV<1);
my @whats = ('<>','<* .*>','<FH>');
my $thing_s;
my @thing_l;
for my $what(@whats){
switch($what){
case('<>'){
$thing_s = <>;
@thing_l = <>;
}
case('<* .*>'){
$thing_s = <* .*>;
@thing_l = <* .*>;
}
case('<FH>'){
open FH, '<', $ARGV[0];
$thing_s = <FH>;
@thing_l = <FH>;
}
}
print "$what in scalar context is: \n".Dumper($thing_s)."\n";
print "$what in list context is: \n".Dumper(@thing_l)."\n";
}