-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、およびさまざまなエディターの行範囲 (コンマ) 演算子をエミュレートします。各 ".." 演算子は、それを含むサブルーチンへの呼び出し間であっても、独自のブール状態を維持します。左オペランドが false である限り、false です。左のオペランドが true になると、範囲演算子は右のオペランドが true になるまで true のままになり、その後、範囲演算子は再び false になります。... スカラー ".." のいずれかのオペランドが定数式の場合、そのオペランドが現在の入力行番号 ($. 変数) と等しい (== ) 場合、そのオペランドは true と見なされます。

于 2013-10-20T21:01:26.207 に答える