스크립트 실행 중에 알려진 해시에 익명 해시를 어떻게 생성하고 추가합니까?

StackOverflow https://stackoverflow.com/questions/1645080

문제

나는 이것을 예제로 설명하려고 시도 할 것이다. 해시 해시의 일반적인 예를 들어보십시오.

my %HoH = (
    flintstones => {
        lead => "fred",
        pal  => "barney",
    },
    jetsons => {
        lead      => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid  => "bart",
    },
);

내 목적을 위해, 나는 이름이없는 해시를 %HOH에 추가 할 수 있기를 원합니다. 런타임까지 이러한 하위 하시를 필요로하지 않거나 정의 할 수 없습니다. Perl로 어떻게이를 달성 할 수 있습니까?

내가 읽은 모든 것 (그리고 Perldocs와 Google이 이미 읽은 모든 것을 읽었습니다)은 모든 하위 하하 (예 : "Flintstones", "Jetsons"및 "Simpsons")가 정의되는 예를 보여주는 것 같습니다.

내가하고있는 일은 CSV 파일에서 행이있는 하위 하시를 포함하는 부모 해시를 구축하려고 시도하는 것입니다.

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

필요한 "%linex"해시의 수는 런타임까지 알려져 있지 않습니다. (런타임에 읽는 CSV의 라인 수를 나타 내기 때문입니다).

어떤 아이디어? 아직 명확하지 않다면 ... 나는 여전히 Perl Hashes 주위에 머리를 감싸려고 노력하고 있습니다.

도움이 되었습니까?

해결책

먼저 구문 분석하는 현재 라인에서 해시를 만듭니다.

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

또는 해시에 대한 참조를 작성하십시오

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

그런 다음 중첩 된 Perl 구조에는 다른 구조에 대한 참조가 포함되어 있음을 기억하면서 전체 해시에 추가합니다.

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

업데이트되었습니다예제 구문 분석 할 데이터 배열에 대한 루프가 주어진 예

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}

다른 팁

런타임에 익명 해시를 추가하려면 일반 해시 요소와 같이 할당하십시오.

$HoH{key} = { foo => 42 };

또는

$HoH{key} = $hash_ref;

또는

$HoH{key} = \%hash;
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}

데이터 라인에서 새 해시를 만들 때마다 해당 데이터를 상단 해시 테이블에 저장하려면 고유 한 키를 생각해야합니다.

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

지금 keys(%HoH) (소식되지 않은) 목록을 반환합니다 "line1","line2","line3",....
$HoH{"line5"} 파일의 5 번째 줄에 대한 데이터에 대한 참조를 반환합니다.
%{$HoH{"line7"}} 추악한 구문이지만 7 행에서 데이터의 해시 가능을 반환합니다.
$HoH{"line14"}{"cell02"} 특정 데이터를 얻는 데 사용될 수 있습니다.

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