2009-08-10 2 views

답변

26

Yes. perldoc -f keys :

키는 명백하게 임의 순서로 반환됩니다. 실제 무작위 순서는 이후 버전의 perl에서 변경 될 수 있지만 values 또는 each 함수가 생성하는 것과 동일한 순서로 보장됩니다 (해시가 수정되지 않은 경우). Perl 5.8.1 이후로 보안상의 이유로 다른 Perl을 실행하는 경우에도 순서가 다릅니다 (perldoc perlsec의 "알고리즘 복잡성 공격"참조).

(강조 광산)

+12

+1 Perl과 함께 제공되는 훌륭한 문서를 적어도 사람들이 읽으려고한다면 좋을 것입니다. –

-2

이것은 매우 위험한 기대합니다. 아마 그럴거야, 근데 왜 걱정이야? 미리 키를 가져온 다음 결과를 저장 한 다음 저장된 결과를 반복합니다. 그런 다음 동일한 순서로 키에 액세스 할 수 있습니다. 지정되지 않은 구현 세부 사항의 가장자리를 다뤄 작업하는 것은 위험합니다.

편집 : 문서에서 "보증"을 놓쳤지 만, 나는 결코 변하지 않을 것이라고 기대하는 것이 위험하다고 생각합니다. 특히 같은 목적을 달성하기위한 더 건전한 방법이있는 경우.

+2

왜 "보증"주위에 겁나는 따옴표가 붙어 있습니까?그것은 (a) 아주 명확하게 진술되었습니다; (b)'keys'와'values'가 동일한 순서로 되돌아 와서'each'를 사용할 수 없을 때 두 값을 연관시킬 수 있기 때문에 변경이 불가능합니다. – derobert

0

편집 : 정상적인 해시 일관된 순서를 가지고 있지만

하는 tied hash의 경우 키의 순서는 사용자가 제어하는대로 가 아니라,을 정의하지 않습니다!


해시 키 순서가 변경되지는 않지만이를 수행해야하는 이유를 다시 고려해야합니다.

아마 두 개가 아닌 한 번에 해시를 처리 할 수 ​​있습니까?

데이터 크기가 충분히 커서 문제가 될만한 크기가 아니라면 해시 키를 방어 프로그래밍 연습으로 배열에 저장해야합니다. 보너스로, 목록을 쉽게 정렬하고 잘 정의 된 순서로 해시를 처리 할 수도 있습니다. 예 :

my @keys = sort keys %myHash; 

이렇게하면 원하는 경우가 아니면 배열 순서가 변경되지 않으므로 해시를 수정할 때 발생하는 문제를 방지 할 수 있습니다.

이렇게하지 않으면 해시를 변경하지 않도록주의해야합니다. 그렇지 않으면 요소의 순서가 변경됩니다. Readonly 모듈을 조사하여이 해시가 수정되지 않았는지 확인하십시오.

+0

나는 그것을 얻지 못합니다. 왜 테스트되고 문서화되어 작동하도록 보장 된 기능에 대해 방어해야합니까? 텍스트 편집기를 사용하고 첫 번째 파일이 자동으로 실패하면 두 번째 파일이 성공할 것이라는 희망으로 File -> Safe를 두 번 호출하면 바보처럼 보입니다. – moritz

+2

@ 모리츠 : 문제는 펄이 주요 주문을 변경하지 않는다는 것입니다. 해시가 수정되면 주문이 변경 될 수 있습니다. 이 답변은 OP 코드베이스의 향후 유지 보수를위한 방어 프로그래밍 전략 (별도의 배열 + Readonly)을 제안하며 Perl 내부와는 아무런 관련이 없습니다. –

+3

강력한 성능상의 이유가없는 한, 항상 정렬하려고합니다. 암시 적으로 특정 순서를 기대하는 코드에 의해 너무 자주 물린 적이 있는데, 관련이없는 변경으로 인해 키 순서가 달라지면 신비스럽게 실패하기 시작합니다. – ysth

관련 문제