2013-02-19 2 views
2

LIFO 또는 FIFO 방식으로 해시를 사용할 수 있습니까? 해시가 추가 된 요소와 동일한 순서로 인쇄되는지 어떻게 확인할 수 있습니까? 그 해시의 본질이다 -요소가 추가 된 순서대로 해시를 인쇄하려면 어떻게해야합니까?

#!/usr/bin/perl 

print "content-type: text/html \n\n"; 

# BEGINNING HASH 
%coins = ("Quarter" , .25, 
      "Dime" , .10, 
      "Nickel", .05); 
# PRINT THE OLD HASH 
while (($key, $value) = each(%coins)){ 
    print $key.", ".$value."<br />"; 
} 

# ADD NEW ELEMENT PAIRS 
$coins{Penny} = .01; 
$coins{HalfDollar} = .50; 

# PRINT THE NEW HASH 
print "<br />"; 
while (($key, $value) = each(%coins)){ 
    print $key.", ".$value."<br />"; 
} 

Nickel, 0.05 
Dime, 0.1 
Quarter, 0.25 

Nickel, 0.05 
Dime, 0.1 
HalfDollar, 0.5 
Penny, 0.01 
Quarter, 0.25

답변

6

당신이

my @coins = qw/ Quarter Dime Nickel Penny HalfDollar /; 

for my $key (@coins) { 
    print "$key, $coins{$key}<br />\n"; 
} 

를 작성할 수 있도록, 해시 키의 별도의 배열을 유지 할 수 있습니다 또는 설치하고 그들이 삽입 된 순서대로 해시 요소를 유지합니다 Tie::IxHash 모듈을 사용할 수 있습니다 이

use strict; 
use warnings; 

use Tie::IxHash; 
tie my %coins, 'Tie::IxHash'; 

print "content-type: text/html \n\n"; 

%coins = (
    Quarter => 0.25, 
    Dime => 0.10, 
    Nickel => 0.05, 
); 

while (my ($key, $value) = each %coins){ 
    print "$key, $value<br />\n"; 
} 

$coins{Penny} = .01; 
$coins{HalfDollar} = .50; 

print "<br />\n"; 
while (my ($key, $value) = each(%coins)){ 
    print "$key, $value<br />\n"; 
} 
+0

감사 :

여기에 코드입니다! 첫 번째 제안은 훌륭하게 작동합니다. – user1758367

2

기본 해시가 순서를 유지하지 않습니다 제공합니다. Tie::IxHash과 같은 모듈을 사용하여 항목이 추가 된 순서를 유지할 수 있습니다.

-1

처럼 나는 Tie::IxHash를 사용할 필요없이 솔루션을 마련했다.

접근법은 해시의 key 앞에 문자/숫자를 추가하는 것입니다.

이렇게하면 keyssort 일 때 해시 키를 푸시 한 순서를 얻을 수 있습니다.

#!/usr/perl/bin -w  
use strict; 
use Data::Dumper; 

my %hash =(); 

my @keys = qw(one two three); 
my $count = 0; 

for(my $i=0; $i<scalar(@keys); $i++) { 
    $hash{ chr($count) . $keys[$i] } = 1; 
    $count++; 
} 

foreach my $key (sort { ord $a <=> ord $b } keys(%hash)) { 
    print substr($key, 1) . " => " . $hash{$key}. "\n"; 
} 
+1

이것은 최대 10 개의 요소에 대해서만 작동합니다! 카운트를 의사 코드 포인트로 인코딩하여 MAXINT 요소로 변경할 수 있습니다. '$ hash {chr ($ count)]로 변경하십시오. $ keys [$ i]}','sort {ord $ a <=> ord $ b}'입니다. 'ord' 함수는 길이가 1보다 큰 문자열이 주어지면 첫 번째 문자의 ord을 반환합니다. – amon

+0

변경되었습니다. @amon에게 감사합니다. –

관련 문제