将数据推入数组的问题,在Perl中声明哈希和条件语句

时间:2014-02-25 11:56:39

标签: regex arrays perl hash conditional-statements

任何人都可以提供帮助,我的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号和名称,我已经过度复杂了,所以如果有更简单,更有效的方法,那就太棒了。

1 个答案:

答案 0 :(得分:0)

将第一个foreach循环更改为:

foreach (@input_vars) {
    if (/(\w+)\s([\w-]+)\s(\d+\.\d+)$/) {
        $id1{$1} = $3;
        $id2{$2} = $3;
    }
}