문제

Perl의 해시를 제대로 이해하고 싶습니다.나는 꽤 오랫동안 Perl을 간헐적으로 사용해야 했는데 대부분 필요할 때마다 텍스트 처리와 관련이 있었습니다.

그리고 해시를 처리해야 할 때마다 상황이 엉망이 됩니다.해시에 대한 구문이 매우 비밀스럽다고 생각합니다.

해시와 해시 참조, 차이점, 필요한 경우 등에 대한 좋은 설명입니다.정말 감사하겠습니다.

도움이 되었습니까?

해결책

간단한 해시는 배열에 가깝습니다. 그들의 초기화는 심지어 비슷해 보입니다. 먼저 배열 :

@last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

이제 해시 (일명 연관 배열)와 동일한 정보를 대표하겠습니다.

%last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

그들은 같은 이름을 가지고 있지만 배열입니다 @last_name 그리고 해시 %last_name 완전히 독립적입니다.

배열을 사용하면 Archie의 성을 알고 싶다면 선형 검색을 수행해야합니다.

my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
  $lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";

해시를 사용하면 훨씬 더 직접적인 구문 적입니다.

print "Archie $last_name{Archie}\n";

약간 더 풍부한 구조로 정보를 대표하고 싶다고 가정 해 봅시다.

  • Cleaver (성)
    • 와드 (이름)
    • 6 월 (배우자의 이름)
  • 플린트 스톤
    • 프레드
    • 윌마
  • 벙커
    • 아키
    • 에디스

참조가 시작되기 전에 Flat Key-Value 해시는 우리가 할 수있는 최선에 관한 것이었지만 참조는 허용합니다.

my %personal_info = (
    "Cleaver", {
        "FIRST",  "Ward",
        "SPOUSE", "June",
    },
    "Flintstone", {
        "FIRST",  "Fred",
        "SPOUSE", "Wilma",
    },
    "Bunker", {
        "FIRST",  "Archie",
        "SPOUSE", "Edith",
    },
);

내부적으로, 키와 값 %personal_info 모두 스칼라이지만 값은 특별한 종류의 스칼라입니다. {}. 참조를 통해 "다차원"해시를 시뮬레이션 할 수 있습니다. 예를 들어, 우리는 wilma를 통해 도달 할 수 있습니다

$personal_info{Flintstone}->{SPOUSE}

Perl은 우리가 첨자 사이의 화살표를 생략 할 수 있으므로 위는 다음과 같습니다.

$personal_info{Flintstone}{SPOUSE}

Fred에 대해 더 알고 싶다면 많은 입력이므로 커서의 일종으로 참조를 가져올 수 있습니다.

$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";

왜냐하면 $fred 위의 스 니펫에는 해시 프르가 있습니다. 화살표가 필요합니다. 당신이 그것을 남겨 두지만 현명하게 활성화된다면 use strict 이러한 종류의 오류를 잡을 수 있도록 컴파일러는 다음과 같습니다.

Global symbol "%fred" requires explicit package name at ...

PERL 참조는 C 및 C ++의 포인터와 유사하지만 결코 늘어날 수는 없습니다. C 및 C ++의 포인터는 DeCeperencing이 필요하며 Perl에서 참조를 수행합니다.

C 및 C ++ 기능 매개 변수에는 패스 별 값 시맨틱이 있습니다. 사본 만 있으므로 수정은 발신자에게 돌아 오지 않습니다. 변경 사항을보고 싶다면 포인터를 통과해야합니다. Perl의 참조 로이 효과를 얻을 수 있습니다.

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

백 슬래시가 없으면 add_barney 서브가 돌아 오자마자 사본을 버렸을 것입니다.

"Fat Comma"의 사용도 참고하십시오 (=>) 위에. 그것은 왼쪽의 문자열을 자동 고려하고 해시 초기화가 구문 적으로 덜 시끄럽게 만듭니다.

다른 팁

다음은 해시 및 해시 참조를 사용하는 방법을 보여줍니다.

my %hash = (
    toy    => 'aeroplane',
    colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";

my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";

또한 참조하십시오 perldoc perldsc.

해시는 Perl의 기본 데이터 유형입니다. 키를 사용하여 내용에 액세스합니다.

해시 심판은 해시에 대한 참조에 대한 약어입니다. 참조는 스칼라이며 간단한 값입니다. 본질적으로 실제 해시 자체에 대한 포인터를 포함하는 스칼라 값입니다.

링크: Perl에서 해시와 해시 심판의 차이 - 우분투 포럼

차이는 삭제를위한 구문에도 차이가 있습니다. C와 마찬가지로 Perl은 해시에 대해 다음과 같이 작동합니다.

delete $hash{$key};

그리고 해시 참조

delete $hash_ref->{$key};

그만큼 Perl Hash Howto 해시 대 해시를 이해하는 훌륭한 리소스입니다.

다른 링크도 있습니다 여기에는 Perl 및 참조에 대한 자세한 정보가 있습니다.

보다 perldoc perlreftut 이는 사용자 컴퓨터의 명령줄에서도 액세스할 수 있습니다.

참조는 전체 배열이나 전체 해시(또는 다른 모든 것)를 참조하는 스칼라 값입니다.이름은 이미 친숙한 일종의 참조입니다.미국 대통령을 생각해 보십시오.지저분하고 불편한 피와 뼈 가방.그러나 그에 대해 이야기하거나 컴퓨터 프로그램에서 그를 표현하려면 쉽고 편리한 스칼라 문자열 "Barack Obama"만 있으면 됩니다.

Perl의 참조는 배열 및 해시의 이름과 같습니다.이는 Perl의 개인 내부 이름이므로 명확하다는 것을 확신할 수 있습니다."버락 오바마(Barack Obama)"와 달리 참조는 한 가지만 언급하며, 그것이 무엇을 가리키는지 항상 알 수 있습니다.배열에 대한 참조가 있는 경우 해당 참조에서 전체 배열을 복구할 수 있습니다.해시에 대한 참조가 있으면 전체 해시를 복구할 수 있습니다.그러나 참조는 여전히 쉽고 컴팩트한 스칼라 값입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top