2011-08-31 31 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

相關問題