2012-06-20 67 views
0

跨張貼在http://perlmonks.org/index.pl?node_id=977333查找在哈希剩餘值越小

鑑於以下散列:

my %hash = (1 => "i", 2 => "j", 3 => "k", 4=> "l"); 

和輸入對

my @pair = (1,2); 
    my @pair2 = (2,3); 
    my @pair3 = (1,3); 
    my @pair4 = (2,4); 

我們想找到鑰匙,%hash哪裏該值小於任何給定對的成員 。

因此,對於所需的輸出是:

@pair -> [] 
@pair2 -> [1] 
@pair3 -> [2] 
@pair4 -> [1,3] 

什麼是正確的算法來做到這一點? 以下是我的代碼,但失敗:

sub get_output { 
    my ($inputhash,$pair) = @_; 

    my @output =(); 
    my %done =(); 
    foreach my $pr (@{$pair}){ 
    foreach my $kn (keys %{$inputhash}){ 
      next if ($pr <= $kn || $done{$kn}); 
      push @output,$kn; 
      $done{$kn} = 1; 

    } 
    } 

    use Data::Dumper; 
    print Dumper \@output; 
    return @output; 
} 
+0

什麼代碼?在您完成發佈問題之前,您似乎已被綁架。 –

+0

您聲明'$ inputhash',但隨後使用'$ input_hash'。你有三個'{'但四個''' – cdarke

+0

@cdarke:已更正。謝謝。 – neversaint

回答

1

這是不是很有效,但它的作品。仍然沒有看到散列點給你的要求輸出不涉及到哈希。:

#!/usr/bin/perl 

use strict; 
use warnings; 
my %hash = (1 => "i", 2 => "j", 3 => "k", 4=> "l"); 
my @pair = (1,2); #tested all your cases and it showed to work 
my $it; 
my $iterator; 
my $sit; 
my @occurence; 
my @oldpair = @pair; 
@occurence = (0, 0, 0, 0); 
foreach(@oldpair) 
{ 
if ($_ == 1) 
{ 
    $occurence[0] += 1; 
} 
if ($_ == 2) 
{ 
    push(@pair, 1); 
    $occurence[0] += 1; 
    $occurence[1] += 1; 
} 
if ($_ == 3) 
{ 
    push(@pair, 2); 
    $occurence[1] += 1; 
    $occurence[2] += 1; 
} 
if ($_ == 4) 
{ 
    push(@pair, 3); 
    $occurence[2] += 1; 
    $occurence[3] += 1; 
} 
} 

foreach $iterator(@occurence) 
{ 
    $it++; 
    if ($iterator > 1) 
    { 
     @pair = grep { $_ != $it } @pair; 
    } 

} 
foreach $sit(@oldpair) 
{ 
    @pair = grep { $_ != $sit } @pair; 
} 
+0

打印@pair最後看 – PinkElephantsOnParade