2009-07-10 3 views
4

임시 배열을 만들지 않고도 해시 키의 마지막 요소에 어떻게 액세스 할 수 있습니까?임시 배열을 사용하지 않고 마지막 Perl 해시 키에 어떻게 액세스합니까?

해시가 정렬되지 않은 것을 알고 있습니다. 그러나 내 키와 같은 응용 프로그램은 간단한 sort 해시 키를 사용하여 주문할 수 있습니다. 내가 왜 이것을 원했는지 설명했으면 좋겠다. barney/elmo 예제는 좋지 않은 선택입니다.하지만 그 어플리케이션은 있습니다.

my %hash = (barney => 'dinosaur', elmo => 'monster'); 
my @array = sort keys %hash; 
print $array[$#{$hash}]; 
#prints "elmo" 

이 작업을 수행하는 방법에 대한 아이디어를 임시 (이 경우 @array)에 호출하지 않고 :

는 다음과 같은 고려? 여분의 괄호가 print의 PARAM 목록과 구문의 혼란을 방지하기 위해 필요하다고

+0

실제로 (sort {$ a cmp $ b} 키 % 해시) [- 1] (을)를 수행 할 예정입니까? – mkb

+0

@Matt : 맞습니다. – Zaid

+2

귀하의 편집 내용이 명확하지 않습니다. 물론 해시 키 목록을 정렬 할 수는 있지만 여기서 표시하지는 않습니다. 정렬 후에 마지막 키를 원한다고 상상할 수는 있지만, 이전에 원하는 키를 생각할 수 없습니다. 이는 코드가 수행하려고 시도하는 것입니다. –

답변

11
print((keys %hash)[-1]); 

참고.

또한 스칼라 문맥으로 강제하고 여분의 괄호 페지이 사악한 트릭을 사용할 수 있습니다. "마지막 요소"

print ~~(keys %hash)[-1]; 
+0

먼저 $ # {$ hash}가 -1을 반환하는 이유를 설명합니다. 팁 고마워. – Zaid

+1

'% hash'와'$ hash '는 완전히 다른 변수입니다. $ $ {hash}는 무명 배열에 대한 참조로'$ hash '를 자동 갱신하기 때문에 -1을 반환합니다. 그 배열은 비어 있기 때문에, (존재하지 않는) 마지막 요소의 인덱스는 -1입니다. –

+0

friedo의 대답을 명확히하기 위해 반복자가 반환 할 마지막 키의 값을 해시 순서로 인쇄합니다. 그것은 마지막으로 삽입 된 키를 출력하지 않습니다. –

2

해시는 순서가있다, 그래서 같은 건 없다 해시를 반복하는 함수 (keys, valueseach)는 주문을 받았지만 의존해야하는 것은 아닙니다.

기술적으로 말해서, 해시는 "해시 순서"를 가지고 있으며이 해시는 이터레이터가 사용하는 것입니다. 해시 순서는 다른 버전의 Perl을 변경할 수있는 해시 알고리즘에 따라 다릅니다. 또한 버전 5.8.1에서 Perl에는 특정 유형의 공격을 방지하기 위해 해시 알고리즘을 변경할 수있는 해시 무작위 화 기능이 포함되어 있습니다.

일반적으로 주문을 염려한다면 대신 배열을 사용해야합니다. perldoc perldata에 따르면

+0

@Michael : 일반적으로 항상 그렇지만 ... – Zaid

+1

@Zaid : 배열은 삽입 순서를 유지하며 해시는 유지하지 않습니다. 정렬은 새로운 순서를 만드는 것과 같은 것이 아닙니다. –

1

:

해시는 관련된 문자열 키에 의해 색인 스칼라 값의 정렬되지 않은 컬렉션입니다.

해시는 순서가 지정되지 않았기 때문에. 죄송합니다. "마지막"요소는 없습니다.

-1

해시는 정렬되지 않은 요소입니다. 마지막 해시 요소가 elmo/

1

다른 사람의 포인트를 더 명확하게 만들려면 동일한 프로세스 수명 기간 동안 키, 값 또는 각을 호출 할 때마다 Perl의 해시 키가 같은 순서로 지정됩니다. 해시가 수정되지 않았습니다. perlfunc :

키는 명백하게 임의 순서로 반환됩니다. 실제 무작위 순서는 perl의 차기 버전에서 변경 될 수 있지만 값 또는 각 함수가 생성하는 것과 동일한 순서로 보장됩니다 (해시가 수정되지 않은 경우). Perl 5.8.1 이후로 보안상의 이유로 다른 순서의 Perl 사이에서도 순서가 다릅니다 ("perlsec"의 "알고리즘 복잡성 공격"참조).당신은 내가 대한 타당한 이유가 표시되지 않는 모듈을 (사용하지 않으려면

use List::Util qw(maxstr); 

print maxstr(keys %hash); 

하지만 사람들이있다 : 당신이 마지막으로 원하는 가정 일반적으로

+0

이것은 완전히 사실이 아닙니다. 해시 키를 변경하지 않으면 해시 키는 같은 순서로만 나옵니다. –

+2

내 대답의 첫 번째 문장을 다시 읽으십시오. 당신이 편집 한 것. – mkb

+0

tie() 'd 해시의 경우에도 항상 그런 것은 아닙니다. –

4

, 알파벳 순으로 정렬, 그것은 간단합니다 사람 좋아하는) 어렵게 만들려면 :

print((sort keys %hash)[-1]); 
0
$h{'11c'} = 'C'; 
$h{'b'} = 'B'; 
$h{'e22'} = 'E'; 
$h{'aaaaa'} = 'AAAA'; 

for (keys %h){ 
     $a = \$h{$_} and $b = $_ if $a < \$h{$_}; 
} 

print "$b\n"; 

을! 명백한 원인으로 인해주의해야 함