如果这个问题听起来很简单,我很抱歉,我的目的是理解深入这个(这些?)特定运算符是如何工作的,我无法在perldocs中找到令人满意的描述(它可能存在于某个地方,我在我的生命中找不到它)
特别是,我有兴趣知道是否
a)<>
b)<*>
或任何glob和
c)<FH>
基本相似或不同,以及它们如何在内部使用。
我构建了自己的测试功能,以获得对此的一些见解(如下所示)。我仍然没有完全理解(我的理解甚至可能是错误的)但这就是我的结论:
<>
<list of globs>
<FH>
似乎在分配给变量时返回undef。
问题:为什么它不合适?它没有类型吗?当FH不是一个裸字文件句柄时,这种行为是否相似?一般问题:处理&lt;&gt;的值是什么?执行期间的其他人?在标量上下文中,返回的是任何类型的引用,还是我们分配给它们的变量,在那一点上与任何其他非ref标量相同?
我也注意到即使我按顺序分配它们,每次都会重置输出。也就是说当我做的时候我会假设
$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";
}
答案 0 :(得分:12)
<>
所有东西都是迭代器。所有这些变体都有共同的行为:
undef
。最后两个属性使其适合用作while
循环中的条件。
有两种迭代器可以与<>
一起使用:
<$fh>
相当于readline $fh
。<* .*>
相当于glob '* .*'
。 <>
在包含任何内容,无字符或简单标量时被解析为readline。可以嵌入更复杂的表达式,如<{ ... }>
。
在所有其他情况下,它被解析为glob。这可以通过使用引号明确显示:<"* .*">
但您应该明确地使用glob
函数代替。
一些细节不同,例如保留迭代器状态的地方:
另一部分是迭代器是否可以重启:
undef
后如果<>
中没有使用文件句柄,则默认为特殊ARGV
文件句柄。 <ARGV>
的行为如下:
@ARGV
为空,则ARGV
为STDIN
。否则,@ARGV
的元素将被视为文件名。执行以下伪代码:
$ARGV = shift @ARGV;
open ARGV, $ARGV or die ...; # careful! no open mode is used
$ARGV
标量包含文件名,ARGV
文件句柄包含该文件句柄。
ARGV
为eof
时,@ARGV
的下一个文件将被打开。@ARGV
完全为空时,<>
才能返回undef
。这实际上可以用作从许多文件中读取的技巧:
local @ARGV = qw(foo.txt bar.txt baz.txt);
while (<>) {
...;
}
答案 1 :(得分:4)
在执行期间处理
<>
和其他人的价值的是什么?
Perl编译器非常具有上下文感,并且通常必须在代码段的多个模糊解释之间进行选择。根据括号内的内容,它会将<>
编译为readline
或glob
。
在标量上下文中,返回的是任何类型的引用,还是我们分配给它们的变量,在这一点上与任何其他非ref标量相同?
我不确定你在这里问什么,或者为什么你认为取<>
结果的变量应该与其他变量有任何不同。它们总是简单的字符串值:glob
返回的文件名,或readline
返回的某些文件数据。
<FH>
似乎在分配给变量时返回undef。问题:为什么它不合适?它没有类型吗?当FH不是一个裸字文件句柄时,这种行为是否相似?
此表单会将FH
视为文件句柄,如果文件处于打开状态而不是eof,则返回文件中的下一行数据。否则返回undef
,表示无法读取任何有效内容。 Perl对类型非常灵活,但undef
表现为它自己的类型,如Ruby的nil
。无论FH
是全局文件句柄还是(包含对typeglob的引用的变量),运算符的行为都相同。