2012-12-03 80 views
1

我在代码的这一部分上花了几个小时,但仍然不知道如何使其工作,所以任何建议都会很棒!(Perl)在文件中搜索另一个文件的文本


我有2个文件,list1.txt和dictionary.txt。 list1.txt看起来像

rs1 
rs2 
rs4 
rs5 

而dictionary.txt看起来像

rs1 1 A G 
rs2 2 C T 
rs3 3 A A 
rs4 4 G G 

列由空格分隔 - 有四列。 我想要做的是针对list1.txt中的每个单词,搜索dictionary.txt中的单词,如果存在,则将dictionary.txt中的整行打印到第三个文件中。如果这个单词在dictionary.txt中不存在,就打印出这个单词。

所以,如果我运行下面上面列出的文件的程序,我的结果应该

rs1 1 A G 
rs2 2 C T 
rs4 4 G G 
rs5 

上述程序:

open(LIST1, '<', 'test_chr1_22.txt') or die "Could not open chr1_22.txt: $!"; 

open(OUTPUT, '>', 'test_chr1_22_all_info.txt'); 

foreach my $line1 (<LIST1>) 
{ 
     foreach my $line (@DICT) 
     { 
      if ($line =~ m/"$line1"/) 
      { 
       print OUTPUT"$line\n"; 
      } 
     } 
} 

这是我的代码现在。我知道它没有我的第二个条件,如果单词在字典中不存在,那么就打印这个单词。但是,我甚至无法解决第一部分,即如果单词在字典中,那么就打印该行。我从这个空白的文本文件中得到什么。任何人都知道发生了什么事?

+0

把使用严格;在代码的顶部。你似乎没有阅读过@DICT,就像你已经阅读过LIST1 – Himanshu

+0

我忘了在帖子中包含我的部分代码,所以我确实拥有它。谢谢你的提醒! – Peter

回答

3

m/"$line1"/是错误的原因很多:

  • 你的字符串中没有对与其匹配包含",所以这永远不会匹配。
  • 你不能逃避$line1的内容,从任意文本形成正则表达式。
  • 如果在字符串的开始处找到文本,则只希望匹配。
  • 如果文本是整个字段,则只希望匹配。

无论如何,一旦你用一个循环和一个哈希查找替换效率极低的嵌套循环,对正则表达式匹配的需求就会消失。

my %dict; 
while (<$DICT>) { 
    my ($key) = split; 
    $dict{$key} = $_; 
} 

while (<$INPUT>) { 
    my ($key) = split; 
    print $dict{$key} // $_; 
} 
+0

谢谢!我刚刚开始学习Perl,因为我正在开发这个项目,所以我仍然在努力弄清楚。但是,我仍然有一个问题。如何让我的脚本打印出现在list1中但不在字典中的单词?现在,它看起来只有当list1中的单词出现在字典中时才会打印该脚本。我可能是错的 - 我还没有试过你的代码,因为我现在不在我的计算机上。 – Peter

+0

如果密钥不在字典中('// $ _') – ikegami

+0

啊,我现在看到了!它默认使用来自list1的行。再次感谢你!很有帮助 :) – Peter

相关问题