2014-04-30 1 views
2

perl에서는 해시로 작업 할 수 있습니다 (예 : my %a = (2, "two");뿐만 아니라 해시 참조 (예 : my $b = {2 => "two"};펄에서 hashref가 아닌 해시를 사용할 수 있습니까?

다차원 해시를 만들 때마다 최상위 해시 값은 항상 해시 레프입니다. 즉, ref()을 호출하면 "HASH"을 반환합니다. 추가 수준의 간접 지정없이 단순한 해시 해시를 가질 수 있습니까? 해시의 해시 펄 아이 해시의 요소를 액세스 할 때 하나의 참조 연산자를 생략 할 수 있도록하여 작업시 부가 적

:

my %a; 
$a{2} = {2 => "two"}; 

# the following are both valid: 
$a{2}->{2} 
$a{2}{2} 

I 번째 단지 문법적 첫번째위한 가정 . 그러나 이 유효한 반면에 $b{2}은 유효하지 않으므로 단순 중첩되지 않은 해시 참조에 필요한 구문과 일치하지 않는 것으로 보입니다.

묻는에 대한 나의 이유는 내가

for my %hash (values %a) { 

또는

for my %hash (map(%{$_}, values %a)) { 

하지만이 두 가지를 말할 수 있었으면한다는 것입니다

는 "누락 $ 루프 변수에"오류의 원인이 컴파일 시간.

+1

제목 만 대답하면됩니다. 불가능합니다. 귀하의 질문은 더 길고 통찰력있는 답변을받을 자격이 있습니다. . . –

+0

"내 % $ 해시 (값 % a) {"가 목표를 달성해야합니다. – Casao

+2

@Casao : 아니요, 그건 잘못되었습니다. Perl 루프 변수는 스칼라 여야합니다. – Borodin

답변

6

처음에는 스칼라, 해시 및 배열 만있었습니다. 실제로 Perl4 였지만 Perl5가 설계 될 때 절대적인 하위 호환성이 중요한 포인트였습니다. 즉 $hash{entry} = @array은 배열을 해시에 넣는 대신 해시 항목에 배열 크기를 계속 할당해야합니다. 따라서 컬렉션에는 스칼라 만 포함될 수 있습니다.

참조이 필요했던 이유 중 하나입니다. 해시 참조 및 배열 참조를 사용하면 컬렉션을 단일 스칼라로 참조 할 수 있습니다. 해시 참조 구문은 해시 구문과 달라야합니다. 간접 참조 화살표 -> (C에서 빌려온 것)은 해시 액세스에 사용할 수 있습니다. $hashref->{entry}. 해시에는 콜렉션이 직접 포함될 수 없으므로 하위 문 사이의 참조 해제 화살표는 해시와 해시 참조 간의 명확성을 위해 필요하지 않으므로 $ref->{a}->{b}$ref->{a}{b}은 동일한 작업을 수행합니다. 그러나 $name%name이 별도의 변수로 동시에 존재할 수 있으므로 hashref 액세스는 $ref{entry}을 사용할 수 없습니다. 해당 구문은 이미 해시 액세스에 사용되고 있기 때문입니다.

간단히 말해서, 구문은 추한 것입니다 만, 하위 호환이 가능하기 때문에 좋습니다.

현재까지 내가 알고있는 한 for my %hash (@hash_references) 또는 for my @array (@hash_references)은 허용되지 않습니다. 필자는 개인적으로이 문법에 대한 어떤 이슈도 보지 못하지만 암시적인 역 참조는 다소 혼란 스럽다. %hash 대신 %$ref을 사용해야하는 것은 그렇게 나쁘지 않습니다.

그런데 해시와 hashref 사이의 차이점은 하위 호환성을 제외하고는 상당히 불필요하기 때문에 Perl6은 참조를 제거했습니다. 콜렉션 변수는 스칼라와 유사하게 동작하지만, 참조가 부족한 "항목 컨텍스트"와 같은 새로운 컨텍스트가 있습니다.

3

아니요, 해시 값은 항상 스칼라입니다. 해시 및 배열은 스칼라가 아니므로 해시 값이 될 수는 없지만 스칼라 참조는 스칼라이므로 해시 값이 될 수 있습니다.

perldata 문서 페이지의 첫 번째 단락은 말한다 (내 강조) : 스칼라, 배열 스칼라의 및 연관 배열 스칼라알려진 :

펄은 세 가지가 내장 데이터 유형이있다 "해시"라고합니다. 스칼라는 단일 문자열 (모든 크기, 사용 가능한 메모리로만 제한됨), 숫자 또는 참조 (perlref에서 논의 됨)입니다. 일반 배열은 0부터 시작하는 숫자로 인덱싱 된 스칼라 목록입니다. 해시는 연관된 문자열 키로 인덱싱 된 스칼라 값의 정렬되지 않은 컬렉션입니다.

1

여분의 간접 레벨없이 단순한 해시 해시를 가질 수 있습니까?

다른 언어는 암묵적으로 사용자가 요구하는 것을 수행하지만 다른 한편으로는 perl에서 찾을 수있는 스칼라 및 목록 컨텍스트가 없습니다.

관련 문제