2012-04-05 3 views
3

해시를 하나씩 트래버스하고 싶습니다. 무작위 방식이 아닙니다. 어떤 생각. 예를 들어 나는 이와 같은 해시 파일을 가지고 있습니다 ...순서대로 해시 트래킹

our %HASH = (
'rajesh:1700' => Bangalore, 
'rajesh:1730' => Delhi, 
'rajesh:1770' => Ranchi, 
'rajesh:1780' => Mumbai, 
'rajesh:1800' => MYCITY, 
'rajesh:1810' => XCF, 
); 

같은 방식으로 인쇄해야합니다. 나는 다음과 같이 시도했지만 실패했다. 어떤 아이디어?

while (my $gPort = each %HASH) 
{ 
    print "$gPort\n"; 
} 


for my $gPort (keys %HASH) 
{ 
    print "$gPort\n"; 
} 

답변

4

질문에서 키를 입력하면 간단한 비교기로 변경하면 원하는 출력이 제공됩니다.

for my $gPort (sort keys %HASH) { 
    print "$gPort => $HASH{$gPort}\n"; 
} 

참고 : 위의 코드를 같은 위치에서 발생하고 같은 길이있을 것이다 키에있는 모든 숫자를 가정합니다. 예를 들어, rajesh:001775 키가 1770과 1780 사이가 아닌 먼저 나오게됩니다.

+0

는이 경우 파일 내용에서 작동하지 않는 등 HASH에게 발생하는 RAJESH : 2130 RAJESH : 1780 RAJESH : 2060 RAJESH : 1810 RAJESH : 1700 RAJESH : 1780 RAJESH : 1810 RAJESH : 1810 RAJESH : 2060 예상 결과는 RAJESH입니다rajesh : 2130 –

+1

해시에서 키를 반복 할 수 없습니다. 해시의 포인트는 고유 한 키를 찾아 연관된 값을 검색하는 것입니다. 정렬 된 쌍만 저장하려는 경우 배열을 사용하십시오. –

+0

네, 그럴 수 없습니다. 방금 키 목록 만 전해주었습니다. 나는 이것이 "rajesh : 1700"이라는 열쇠를 의미합니다. –

1

VALUE (키가 아닌) 순서로 해시를 정렬하고 인쇄 할 수 있습니다.

for my $gPort (sort { $HASH{$a} <=> $HASH{$b} } keys %HASH) { 
    print "$gPort => $HASH{$gPort}\n"; 
} 
0

Data::Dumper을 살펴보십시오. 특히 $Data::Dumper::Sortkeys으로 설정하면 덤프가 정렬 된 순서로 표시됩니다. 예를 들어

: 물론

use Data::Dumper; 
$Data::Dumper::Sortkeys = 1; 

my %some_hash; 

# code to populate hash 
[ . . . ] 

print Dumper(\%some_hash); 

, 당신은 분명 해시를 덤프 할 경우에만 동작합니다. 당신이 인쇄 다른 형식으로 수행 할 경우 다음 해시 Tie::IxHash 당신의 요소의 삽입 순서를 유지하려면, 당신은 단지

foreach my $key (sort keys %some_hash) { 
    print "[KEY]: $key; [VAL]: $some_hash{$key}\n"; 
} 
0

처럼 키와 인쇄를 정렬 할 것 할 수있다 당신을위한 도구가 되십시오. 당신에게 간단한 예를보기

: 그것은 사용이 매우 간단입니다

use Tie::IxHash;   
    tie my %days_in => 'Tie::IxHash', 
      January => 31, 
      February => 28, 
      March  => 31, 
      April  => 30, 
      May  => 31, 
      June  => 30, 
      July  => 31, 
      August => 31, 
      September => 30, 
      October => 31, 
      November => 30, 
      December => 31;  


     print join(" ", keys %days_in), "\n";   
    # prints: January February March April May June July August 
    # September October November December