Perl标量范围算子

时间:2013-10-20 20:58:07

标签: perl

为什么跟随perl脚本打印$ a = 3和$ b = 5的所有行(1到14)。 如果我将“if(my $ num = $ a .. $ b)”改为“if(my $ num = 3 .. 5)”,它会给我(按预期)

1 3

2 4

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 

1 个答案:

答案 0 :(得分: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和各种编辑器的行范围(逗号)运算符。每个“..”运算符都保持自己的布尔状态,甚至在调用包含它的子例程时也是如此。只要其左操作数为假,它就是假的。一旦左操作数为真,范围运算符将保持为真,直到右操作数为真,此后范围运算符再次变为假。   ...   如果标量“..”的任一操作数是常量表达式,如果该操作数与当前输入行号($。变量)相等(==),则该操作数被视为true。