任何人都可以提供帮助,我的Perl脚本出现问题。我想将一个3列数据输入文件推入一个数组,选择ID号和名称,使用两个ID作为键来声明一个哈希值,并将值作为值声明,然后运行if-else条件语句来选择键 - 值对大于2的值对。
以下是input.txt
数据文件column 1 is ID number, column 2 is ID name and column 3 value associated with columns 1 and 2
的示例。
ENSG00000251791 SCARNA6 2.5
ENSG00000238862 SNORD19B 6.3
ENSG00000238527 SN-112 -3
ENSG00000222373 RNY.5P5 1.3
我可以得到第一部分将数据推送到数组中,但我可以完成剩下的工作。我创建了两个包含ID号的哈希:值和ID名称:值对,因为我喜欢输出文件中的两列:
ENSG00000251791 SCARNA6 2.5
ENSG00000238862 SNORD19B 6.3
以下是代码:
use strict;
use warnings;
my $input = 'input.txt';
my @input_vars;
open my $input_file_handle, '<', $input or die $!;
while (<$input_file_handle>) {
chomp $_;
push @input_vars, $_;
}
close $input_file_handle;
# regex to select ID name, ID number and value
my %id;
foreach (@input_vars) {
my $regex = '/\w+\s[\w-]+\s\d+\.\d+/';
while ($_ =~ m/$regex/g) {
my $id1{$1} = $3;
my $id2{$2} = $3;
}
}
foreach (@input_vars) {
print "$_ ";
if ($id1{$_} >= 2) {
print "$id1{$_}";
} else {
print "N/A";
}
if ($id2{$_} >= 2) {
print "$id2{$_}";
} else {
print "N/A";
print "n";
}
我认为通过创建一个正则表达式来选择ID号和名称,我已经过度复杂了,所以如果有更简单,更有效的方法,那就太棒了。
答案 0 :(得分:0)
将第一个foreach循环更改为:
foreach (@input_vars) {
if (/(\w+)\s([\w-]+)\s(\d+\.\d+)$/) {
$id1{$1} = $3;
$id2{$2} = $3;
}
}