当触发器运算符被赋予常量操作数时,它隐含地意味着将它们与$.
(当前行号)进行比较,3..5
实际上是(($.==3) .. ($.==5))
. 如果使用变量,则需要显式进行比较。
所以:
#!/usr/bin/perl
use strict;
use warnings;
my $first_line = 3;
my $last_line = 5;
while (<DATA>) {
if (my $num = ($first_line==$.) .. ($last_line==$.) ) {
print $num,"\t", $_;
}
}
这不是一个错误。有意允许您将其缩写为 3..5。它不能接受其他东西并假设它们是行号,因为您可以使用任意布尔表达式(例如 3../last/ 匹配从第 3 行到包含“last”的行)。
http://perldoc.perl.org/perlop.html#Range-Operators:
在标量上下文中,“..”返回一个布尔值。该运算符是双稳态的,就像一个触发器,并模拟 sed、awk 和各种编辑器的行范围(逗号)运算符。每个“..”运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要它的左操作数是假的,它就是假的。一旦左操作数为真,范围运算符保持真,直到右操作数为真,之后范围运算符再次变为假。...如果标量“..”的任一操作数是常量表达式,则如果该操作数等于(==)当前输入行号($. 变量),则认为该操作数为真。