2013-10-20 61 views
-1

为什么遵循perl脚本打印$ a = 3和$ b = 5的所有行(1到14)。 如果我改变 “如果(我的$ NUM = $ A .. $ B)”,以 “如果(我的$ NUM = 3..5)” 它给了我(预期)Perl标量范围运算符

3E0 5

#!/usr/bin/perl 
$a=3; 
$b=5; 
while (<DATA>) { 
    if (my $num = $a .. $b) { 
     print $num,"\t", $_; 
    } 
} 
__DATA__ 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 

回答

6

当触发器操作者给定的恒定的操作数,它隐含意味着比较它们$.(当前行号),所以实际上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和各种编辑器的行范围(逗号)运算符。每个“..”运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要其左操作数是假的,它就是错误的。一旦左操作数为真,范围运算符保持为真,直到右操作数为真,在此之后范围运算符再次变为假。 ... 如果标量“..”的任一操作数是一个常量表达式,那么如果该操作数与当前输入行号($。变量)相等(==),则认为该操作数为真。