作者:卖火柴的kula1988zkef | 来源:互联网 | 2022-12-02 18:00
我有一个单独的两个文本文件选项卡.
档案1:
21 114352848
6 73853300
17 53191768
13 28008170
35 34642708
25 18912643
文件2:
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
然后,我想知道是否有其他有效的方法来编写此示例的脚本.
1> choroba..:
$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;
}