Perl Flip Flop运算符和行号

Joh*_*n C 2 perl operators flip-flop

我在看另一个问题时注意到了这一点......

如果我有这样的脚本:

while (<>) {
  print if 5 .. undef;
}
Run Code Online (Sandbox Code Playgroud)

它会跳过第1..4行,然后打印文件的其余部分.但是如果我试试这个:

my $start_line = 5;
while (<>) {
  print if $start_line .. undef;
}
Run Code Online (Sandbox Code Playgroud)

它从第1行打印.任何人都可以解释原因吗?

实际上我甚至不确定为什么第一个有效.

嗯,进一步研究这个我发现这有效:

my $start = 5;
while (<>) {
  print if $. ==  $start .. undef;
}
Run Code Online (Sandbox Code Playgroud)

所以第一个版本神奇地使用了$.哪个是行号.但我不知道为什么它失败了变量.

Zai*_*aid 9

在触发器中使用裸号被视为对行计数变量的测试$..来自perldoc perlop:

如果标量的任一操作数".."常量表达式,则如果该操作数==与当前输入行号($.变量)相等(),则该操作数被视为true .

所以

print if 5 .. undef;
Run Code Online (Sandbox Code Playgroud)

是"速记":

print if $. == 5 .. undef;
Run Code Online (Sandbox Code Playgroud)

对于标量变量,情况并非如此,因为它不是常量表达式.这就是它没有经过测试的原因$..

  • Perl 有时更像是一本“魔法书”而不是一种语言。 (2认同)
  • @JohnC:这对英语来说更加真实:) (2认同)