는Perl은 일관되게 정렬 된 해시 키를 반환하도록 보장됩니까?
foreach (keys %myHash) {
... do stuff ...
}
foreach (keys %myHash) {
... do more stuff ...
}
같은 것을 감안할 때 펄은 해시가 변경되지 않은 경우 일관된 순서로 키를 반복 보장인가?
는Perl은 일관되게 정렬 된 해시 키를 반환하도록 보장됩니까?
foreach (keys %myHash) {
... do stuff ...
}
foreach (keys %myHash) {
... do more stuff ...
}
같은 것을 감안할 때 펄은 해시가 변경되지 않은 경우 일관된 순서로 키를 반복 보장인가?
키는 명백하게 임의 순서로 반환됩니다. 실제 무작위 순서는 이후 버전의 perl에서 변경 될 수 있지만 은
values
또는each
함수가 생성하는 것과 동일한 순서로 보장됩니다 (해시가 수정되지 않은 경우). Perl 5.8.1 이후로 보안상의 이유로 다른 Perl을 실행하는 경우에도 순서가 다릅니다 (perldoc perlsec
의 "알고리즘 복잡성 공격"참조).
(강조 광산)
+1 Perl과 함께 제공되는 훌륭한 문서를 적어도 사람들이 읽으려고한다면 좋을 것입니다. –
이것은 매우 위험한 기대합니다. 아마 그럴거야, 근데 왜 걱정이야? 미리 키를 가져온 다음 결과를 저장 한 다음 저장된 결과를 반복합니다. 그런 다음 동일한 순서로 키에 액세스 할 수 있습니다. 지정되지 않은 구현 세부 사항의 가장자리를 다뤄 작업하는 것은 위험합니다.
편집 : 문서에서 "보증"을 놓쳤지 만, 나는 결코 변하지 않을 것이라고 기대하는 것이 위험하다고 생각합니다. 특히 같은 목적을 달성하기위한 더 건전한 방법이있는 경우.
왜 "보증"주위에 겁나는 따옴표가 붙어 있습니까?그것은 (a) 아주 명확하게 진술되었습니다; (b)'keys'와'values'가 동일한 순서로 되돌아 와서'each'를 사용할 수 없을 때 두 값을 연관시킬 수 있기 때문에 변경이 불가능합니다. – derobert
편집 : 정상적인 해시 일관된 순서를 가지고 있지만
하는 tied hash의 경우 키의 순서는 사용자가 제어하는대로 가 아니라,을 정의하지 않습니다!
해시 키 순서가 변경되지는 않지만이를 수행해야하는 이유를 다시 고려해야합니다.
아마 두 개가 아닌 한 번에 해시를 처리 할 수 있습니까?
데이터 크기가 충분히 커서 문제가 될만한 크기가 아니라면 해시 키를 방어 프로그래밍 연습으로 배열에 저장해야합니다. 보너스로, 목록을 쉽게 정렬하고 잘 정의 된 순서로 해시를 처리 할 수도 있습니다. 예 :
my @keys = sort keys %myHash;
이렇게하면 원하는 경우가 아니면 배열 순서가 변경되지 않으므로 해시를 수정할 때 발생하는 문제를 방지 할 수 있습니다.
이렇게하지 않으면 해시를 변경하지 않도록주의해야합니다. 그렇지 않으면 요소의 순서가 변경됩니다. Readonly 모듈을 조사하여이 해시가 수정되지 않았는지 확인하십시오.
나는 그것을 얻지 못합니다. 왜 테스트되고 문서화되어 작동하도록 보장 된 기능에 대해 방어해야합니까? 텍스트 편집기를 사용하고 첫 번째 파일이 자동으로 실패하면 두 번째 파일이 성공할 것이라는 희망으로 File -> Safe를 두 번 호출하면 바보처럼 보입니다. – moritz
@ 모리츠 : 문제는 펄이 주요 주문을 변경하지 않는다는 것입니다. 해시가 수정되면 주문이 변경 될 수 있습니다. 이 답변은 OP 코드베이스의 향후 유지 보수를위한 방어 프로그래밍 전략 (별도의 배열 + Readonly)을 제안하며 Perl 내부와는 아무런 관련이 없습니다. –
강력한 성능상의 이유가없는 한, 항상 정렬하려고합니다. 암시 적으로 특정 순서를 기대하는 코드에 의해 너무 자주 물린 적이 있는데, 관련이없는 변경으로 인해 키 순서가 달라지면 신비스럽게 실패하기 시작합니다. – ysth
호기심에 넘쳐서 -이 건물이 무엇을 필요로합니까? – hillu
누가 모든 것을 투표하고 있습니까? – erjiang