0

我想编写一个执行以下操作的脚本:用户可以选择导入一个 .txt 文件(为此我已经编写了代码)(here $list1)。该文件仅包含一列,每行都有名称。如果用户导入了一个非空文件,那么我想将另一个文件(此处$file2)的列中的名称与导入文件中的名称进行比较。我有一个匹配,那么这个原始文件的整行($file2)应该放在一个新文件中($filter1)中。

这是我到目前为止所拥有的:

my $list1;

if (prompt_yn("Do you want to import a genelist for filtering?")){
    my $genelist1 = prompt("Give the name of the first genelist file:\n");
    open($list1,'+<',$genelist1) or die "Could not open file $genelist1 $!";
}

open(my $filter1,'+>',"filter1.txt") || die "Can't write new file: $!";

my %hash1=();
while(<$list1>){ # $list1 is the variable from the imported .txt file
    chomp;    
    next unless -z $_;
    my $keyfield= $_; # this imported file contains only one column
    $hash1{$keyfield}++;
}

seek $file2,0,0; #cursor resetting
while(<$file2>){ # this is the other file with multiple columns
    my @line=split(/\t/);  # split on tabs
    my $keyfield=$line[2]; # values to compare are in column 3       
    if (exists($hash1{$keyfield})){
    print $filter1 $_;
    }       
}   

运行此脚本时,我的输出filter1.txt为空。这是不正确的,因为列之间肯定存在匹配。

4

1 回答 1

1

因为您已将 $list1 文件句柄声明为块内的词法(“my”)变量,所以它仅在该块中可见。

所以脚本中的后面几行看不到 $list1 并且它给出了提到的错误消息

要解决此问题,请在打开文件的 if.. 块之前声明 $list1

就脚本而言,不在 %hash1 中设置键或值

您的规范很模糊,但您可能想要的是从 file1 加载 hash1 键

while(<$list1>){            # $list1 is the variable from the imported .txt file
    chomp;                  # remove newlines
    my $keyfield=$_;        # this imported file contains only one column
    $hash1{$keyfield}++;    # this sets a key in %hash1
    }

然后当通过file2

while(<$file2>){                      # this is the other file with multiple columns
    my @line=split(/\t/);             # split on tabs
    my $keyfield=$line[2];            # values to compare are in column "2"      
    if (exists($hash1{$keyfield}) ){  # do hash lookup for exact match
        print $_;                     # output entire line
    } 

顺便说一句,$line[2] 实际上是第 3 列,第一列是 $line[0],第二列是 $line[1] 等等

如果您确实想要进行部分匹配或模式匹配(如 grep),则不适合使用哈希

print $_; # output entire line最后,如果这是您需要的,您将不得不修改输出到文件。我删除了对 $filter1 的引用,因为它没有在显示的脚本片段中声明

于 2013-08-12T08:11:10.343 回答