2011-08-31 77 views
0

我是Perl的新手,并试图学习它。我有两个文件,“文件1”和“文件2”,我需要找到哪些符号“文件1”不是“文件2”的公司A和部门B和C.使用Perl在文件中查找符号

文件1

GTY 
TTY 
UJK 
TRE 

文件2

departmentA_companyA.try=675 UJK 88 KKR 
departmentA_companyB.try=878 UJK 37 TAR 
departmentA_companyC.try=764 UJK 92 PAM 
departmentB_companyA.try=675 UJK 88 KKR 
departmentB_companyB.try=878 UJK 37 TAR 
departmentB_companyC.try=764 UJK 92 PAM 
departmentC_companyA.try=675 UJK 88 KKR 
departmentC_companyB.try=878 UJK 37 TAR 
departmentC_companyC.try=764 UJK 92 PAM 
+0

我还在寻找从哪里开始..你可以请给我方向 – Sam

+2

不知道你以前的知识东西,没有你做任何迹象表明一些工作自己,最好的我可以做的是建议你谷歌“如何提出问题的智能方式”... –

回答

3
  1. 创建文件1中所有符号的列表
  2. 浏览文件2。如果条件匹配,请从列表中删除该符号。

在这种情况下,我建议你使用哈希键来存储这个列表($symbols{$symbol} = 1;)。这是因为从散列中删除(delete $symbols{$symbol};)很容易且便宜。

剧透:

use strict; 
use warnings; 
use feature qw(say); 

my %symbols; 
{ 
    open(my $fh, '<', 'file1') 
     or die("Can't open file1: $!\n"); 

    while (<$fh>) { 
     chomp; 
     ++$symbols{$_}; 
    } 
} 

{ 
    open(my $fh, '<', 'file2') 
     or die("Can't open file2: $!\n"); 

    while (<$fh>) { 
     chomp; 
     my ($key, $val) = split /=/; 
     my ($dept, $co) = split /[_\.]/, $key; 
     if ($co eq 'companyA' || $dept eq 'departmentB' || 'departmentC') { 
     my @symbols = split ' ', $val; 
     delete @symbols{@symbols}; 
     } 
    } 
} 

say for keys %symbols; 
+0

非常感谢..我会研究它 – Sam

+0

@Sam,它实际上与David Nehme的解决方案非常相似。找到公司和部门更加准确。 (例如,试图找到“IT”设备不会意外地与“购买IT”公司匹配)。这更简单,因为我没有保留发现事件的次数。这更长,因为我将关注分为不同的块。 – ikegami

+0

@Sam,修正了一个小错误。 – ikegami

2

您可以使用哈希来计算每个符号在文件中出现的次数,然后打印具有计数的那些0

use strict; 

open SYMS, $ARGV[0] || die; 
open INFILE, $ARGV[1] || die; 

my %symbols; 

while (<SYMS>) { 
    chomp; 
    $symbols{$_} = 0; 
} 

while (<INFILE>) { 
    my @F=split; 
    next unless $F[0] =~ /companyA/; 
    next unless $F[0] =~ /department[BC]/; 
    ++$symbols{$F[1]} if (defined $symbols{$F[1]}); 
    ++$symbols{$F[3]} if (defined $symbols{$F[3]}); 
} 

for my $symbol (keys %symbols) { 
    print "$symbol\n" if $symbols{$symbol} == 0; 
} 
+0

感谢您的帮助....我会在这工作 – Sam

相关问题