【问题标题】:(Perl) Searching a file for text from another file(Perl) 在一个文件中搜索另一个文件中的文本
【发布时间】:2012-12-03 09:12:54
【问题描述】:

我在这部分代码上花了几个小时,但仍然不知道如何使它工作,所以任何建议都会很棒!


我有 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";
            }
        }
}

这是我现在拥有的代码。我知道它没有我的第二个条件,即如果字典中不存在该单词,则只需打印该单词。但是,我什至无法解决第一部分,如果单词在字典中,则打印该行。我从这个空白文本文件中得到什么。有谁知道怎么回事?

【问题讨论】:

  • 使用严格;在代码的顶部。你似乎没有在任何地方读过@DICT,就像你读过 LIST1
  • 我忘记在帖子中包含我的那部分代码,所以我有它。不过感谢您的提醒!

标签: perl file search


【解决方案1】:

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

  • 您匹配的所有字符串都不包含",因此这永远不会匹配。
  • 您不能转义 $line1 的内容以从任意文本形成正则表达式。
  • 如果文本位于字符串的开头,您只想匹配。
  • 您只想匹配文本是整个字段。

无论如何,一旦你使用循环和哈希查找替换效率极低的嵌套循环,就不再需要正则表达式匹配了。

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

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

【讨论】:

  • 谢谢!我刚刚开始为我正在从事的这个项目学习 Perl,所以我仍在努力解决问题。但是,我仍然有一个问题。如何让我的脚本打印出现在 list1 但不在字典中的单词?现在,看起来脚本只会在 list1 中的单词出现在字典中时打印。我可能是错的 - 我还没有尝试过你的代码,因为我现在不在我的电脑上。
  • 如果键不在字典中,则默认使用 list1 中的行 (// $_)
  • 啊,我明白了!再次感谢你!非常有帮助:)
猜你喜欢
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多