我想打印指定范围内的所有行。我到目前为止的测试代码是:
#!/usr/bin/perl
use warnings;
use strict;
my $start = "25823";
my $end = "35841";
while (<DATA>) {
if ( /(\S+)?\t(\d+)?\t(\d+)?/ ) {
my $feat = $1;
my $datastart = $2;
my $dataend = $3;
if ( $datastart >= $start && $dataend <= $end ) { print }
}
}
__DATA__
A 23594 24158
W 25646 25978
X 26189 26770
Y 31694 33466
Z 34568 36125
B 37516 38912
但是这只打印X和Y行,它们在范围内,但是以独占形式。但是我想获得所有包含线,以便输出为W,X,Y和Z.如何实现?
提前致谢。
答案 0 :(得分:2)
如果您想要重叠范围(而不仅仅是完全包含),您必须扩展您的IF条件。
注意:由于我不了解您的规范,您必须决定下面是<
还是<=
。
#!/usr/bin/perl
use warnings;
use strict;
my $start = "25823";
my $end = "35841";
while (<DATA>) {
chomp;
my ($feat, $datastart, $dataend) = split "\t";
if (grep {$start < $_ && $_ < $end} ($datastart, $dataend) ) {
print "$_\n"
}
}
__DATA__
A 23594 24158
W 25646 25978
X 26189 26770
Y 31694 33466
Z 34568 36125
B 37516 38912
输出:
W 25646 25978
X 26189 26770
Y 31694 33466
Z 34568 36125