-1

为什么下面的 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 
4

1 回答 1

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

于 2013-10-20T21:01:26.207 回答