我在看another question ...
时注意到了这一点如果我有这样的脚本:
while (<>) {
print if 5 .. undef;
}
它跳过第1..4行,然后打印文件的其余部分。 但是如果我试试这个:
my $start_line = 5;
while (<>) {
print if $start_line .. undef;
}
从第1行打印。 任何人都可以解释原因吗?
实际上,我甚至不确定为什么第一个有效。
嗯嗯进一步研究这个我发现这个有效:
my $start = 5;
while (<>) {
print if $. == $start .. undef;
}
因此,第一个版本神奇地使用$.
这是行号。但是我不知道为什么它会因变量而失败。
答案 0 :(得分:9)
在触发器中使用裸号被视为对行计数变量$.
的测试。来自perldoc perlop
:
如果标量
".."
的任一操作数是 常量表达式 ,那么 如果操作数与当前输入相等(==
),则认为该操作数为真 行号($.
变量)。
所以
print if 5 .. undef;
是“速记”:
print if $. == 5 .. undef;
对于标量变量同样如此,因为不是常量表达式。这就是为什么它没有针对$.
进行测试。