我有两个用制表符分开的文本文件。
文件1:
21 114352848
6 73853300
17 53191768
13 28008170
35 34642708
25 18912643
file2:
ABHD17B 1 85806534 85893402
ACAT2 1 49011742 49029143
ACTN4 21 114352846 114428174
ADGRG6 1 33969266 34107014
AFDN 17 55435472 55536326
AGTPBP1 6 73853296 74033587
AHI1 13 28008167 28198117
AIG1 35 34642706 34886059
AKAP12 25 41614908 41711677
AKAP7 25 69361015 69483139
AKT2 16 113380376 113406769
ALDH16A1 1 107032288 107047268
输出:
ACTN4 21 114352846 114428174
AGTPBP1 6 73853296 74033587
AHI1 13 28008167 28198117
AIG1 35 34642706 34886059
我想按列进行正则表达式匹配。 首先,我要检查文件1中的第1列与文件2中的第2列是否匹配。如果是,则检查文件1中的第2列是否位于文件2中第3列和第4列之间的数字范围内。
我的perl代码:
#!/usr/bin/perl
use warnings;
use strict;
my %hash;
my @values;
my @value;
my $line;
my $min;
my $max;
open my $IN1, '<', 'file1.txt' or die $!;
while (<$IN1>) {
my @values = split;
my $line = $values[1];
undef $hash{$values[0]};
}
close $IN1;
open my $IN2, '<', 'file2.txt' or die $!;
while (<$IN2>) {
chomp;
my @value = split;
my $min = $value[2];
my $max = $value[3];
if (exists $hash{$value[1]}) {
if ($line >= $min && $line <= $max){
print "$_\n";
}
}
}
close $IN2;
我不确定为什么我的代码不起作用。 我得到了警告: 在.pl第XX行的数字ge(> =)中使用未初始化的值$ line
然后,我想知道还有其他有效的方法可以编写此示例的脚本。
答案 0 :(得分:5)
在第二个循环中根本没有使用变量$line
。在第一个循环中,您声明另一个$line
遮蔽外部变量。最好不要在超出实际需要的范围内声明变量。
#!/usr/bin/perl
use warnings;
use strict;
my %hash;
open my $IN1, '<', 'file1.txt' or die $!;
while (<$IN1>) {
my @values = split;
$hash{ $values[0] } = $values[1];
}
open my $IN2, '<', 'file2.txt' or die $!;
while (<$IN2>) {
my @values = split;
my ($min, $max) = @values[2, 3];
print if exists $hash{ $values[1] }
&& $hash{ $values[1] } > $min
&& $hash{ $values[1] } < $max;
}
答案 1 :(得分:1)
除了该单个比较之外,您永远不会在第二个循环中分配或使用$line
。它的目的是什么。您可能要改用$hash{ $value[1] }
吗?