2011-03-08 23 views
0

我在製作一個用於匹配兩個文檔中的數字的Perl程序時遇到了問題。比方說,有文件A和B.打印出現在documentA中的數字,但沒有出現在documentB

所以我想有它存在於文檔A和缺席的文件B.

例1的數字:

DOCA:1 2 3 5 6 8 9 10 11 12 13

DocB:1 2 3 6 7 8 9 10 11

輸出:

編輯:

@a=qw(1 2 3 5 6 8 9 10 11 12 13); 
@b=qw(1 2 3 4 5 6 7 8 9 10 11); 
@new=(); 
@new1=(); 
for($i=0;$i<=$#a;$i++) 
{ 
    for($j=0;$j<=$#b;$j++) 
    { 
    if($a[$i] ne $b[$j]) 
    { 
     push(@new,$b[$j]); 
    } 
    } 
} 
+0

以上是我編寫的程序,但無法得到答案,如何糾正程序 – supratim

回答

0

您可以使用CPAN模塊Array :: Utils。以下將做你所需要的:

use Array::Utils qw(:all); 

my @a = qw(1 2 3 5 6 8 9 10 11 12 13); 
my @b = qw(1 2 3 4 5 6 7 8 9 10 11); 

my @diff = array_minus(@a, @b);` 

順便說一句,你的程序不工作的原因是因爲你犯了一個邏輯錯誤。您將@ new EVERY TIME值添加到值不匹配。因此,在循環的第一次迭代中,您將一個值與b值進行比較。即使該值等於@b的第一個元素,它也不等於@b的其他十個元素,因此所有這些元素都將添加到@new。我已經重寫了你的循環。注意更多的Perlish循環,而不是您在代碼中使用的C循環。

my @a = qw(1 2 3 5 6 8 9 10 11 12 13); 
my @b = qw(1 2 3 4 6 7 8 9 10 11); 
my @new =(); 

for my $a_value (@a) { 
    my $b_not_in_a = 1; 
    INNER: for my $b_value (@b) 
    { if($a_value == $b_value) { 
     $b_not_in_a = 0; 
     last INNER;  } 
    } 

    if ($b_not_in_a) 
    { 
     push(@new,$a_value); 

    } 
} 
+0

雅我已經得到它,感謝您的想法。 – supratim

0

你可以使用散列。閱讀DOCA在使用讀取的數字作爲鑰匙初始化哈希:

open(INPUT, "DocA"); 
while (<INPUT>) 
{ 
    chomp; 
    $myhash{$_} = 1; 
} 

然後閱讀DocB和foreach號,檢查是否已經在你的哈希定義:

open(INPUT, "DocB"); 
while (<INPUT>) 
{ 
    chomp; 
    if (not defined $myhash{$_}) 
    { 
     print "$_\n"; 
    } 
} 
  • 此代碼asumes你有每行號碼。如果您的文件格式不同,則需要對其進行修改。
  • 即使您的號碼未訂購,此代碼也可以正常工作。
0

您示例中的列表已排序。我假設他們是,並且你不允許使用模塊,因爲它是作業。另外,由於這是作業,我不會給出答案,但有一些暗示方向正確。

如果你想手工做這件事,而你只允許看一眼每一行的前面,你會怎麼做?如果A的頭部比B小,那這是什麼意思?如果相等,那是什麼意思?如果它更大,那是什麼意思?

現在你知道如何處理一種情況了,你可以創建某種步驟來減少問題。現在定義何時需要停止,以及列表中可能的剩菜剩餘量是多少,以及如何根據您在該步驟中收集的值以及剩餘的停止後的結果來獲得答案。

的極端情況下,一些例子:

@a = qw(); 
@b = qw(1 2 3); 

@a = qw (1 2 3); 
@b = qw (4 5 6); 

@a = qw(1 3 5); 
@b = qw(2 4 6) 

祝你好運!