当匹配的文本不在$ _时,如何使用带有正则表达式的范围运算符?

时间:2017-03-02 13:27:43

标签: perl diamond-operator

我正在尝试在解析文件的一部分时使用范围运算符。基本上,我的代码包括:

use strict;
use warnings;

while (<DATA>){
    if (/start/ .. /stop/){
        print; #print only lines between the two markers
    }
}
__DATA__
ignored 1
ignored 2
start
taken 1
taken 2
stop
ignored 3

我的问题是此代码使用隐式$_变量。

我的实际代码使用变量来存储当前行,因为我在使用范围运算符测试之前对$line进行了一些更改。我还没有找到一种方法来使用..运算符和显式变量。我在测试之前通过分配$_找到了一种解决方法,但这看起来像是一个丑陋的黑客:

use strict;
use warnings;

while (defined (my $line = <DATA>)){
    $_ = $line;
    if (/start/ .. /stop/){
        print $line;
    }
}
__DATA__
ignored 1
ignored 2
start
taken 1
taken 2
stop
ignored 3

有更简洁的方法吗?

1 个答案:

答案 0 :(得分:4)

你可以这样做:

while (my $line = <DATA>) {
    if ($line =~ /start/ .. $line =~ /stop/) {
        print $line;
    }
}