2013-10-20 60 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和各種編輯器的行範圍(逗號)運算符。每個「..」運算符都維護自己的布爾狀態,即使在調用包含它的子例程時也是如此。只要其左操作數是假的,它就是錯誤的。一旦左操作數爲真,範圍運算符保持爲真,直到右操作數爲真,在此之後範圍運算符再次變爲假。 ... 如果標量「..」的任一操作數是一個常量表達式,那麼如果該操作數與當前輸入行號($。變量)相等(==),則認爲該操作數爲真。