전달하는 방법에 해시 Perl

작업입니다. 의 코드에서는 Perl 프로그램이 있는 해시 %h. 에서 이 해시의 일부 쌍의 값이 있습니다. 를 통해 이동해야한 모든 이 해시 항목과 작업을 수행할 수은 각 항목입니다.

을 통해 걸어 해쉬를 사용하여 foreach

대부분의 경우,가장 편리한 방법으로 우회하는 해쉬를 사용하는 것입 foreach. 여기에는 예제 코드:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
}

그것은 모두 아주 간단합니다. 먼저 우리는 해시를 만들 %h 는 세쌍의 값이 있습니다. 다음에는 주기입니다. 사용 keys %h 우리가 얻은 모든 목록 해시 키(이 예에서 선 'a', 'b''asdf'). 키 문자열에 기록되는 변수 $key ,그리고 실행하는 루프 본문 다음에 $key 에 맞는 다음 해시키 다시 실행하는 루프에 몸이 이런 모든 키를 사용합니다.

저장할 경우 이 코드는 파일 script.pl 고 그것을 실행 perl script.pl,다음 화면이 나타납니다 집의 값의 쌍 에 포함되어 해쉬:

b - 20
asdf - Hello
a - 1

해시는 순서가 설정되는 값입니다. 그리고 결론을 명확히 표시하는 순서 그것을 철회되었다 요소 해시의 일치하지 않기 위해서는 그들에 정의된 프로그램 코드입니다. 고 실행하는 경우 이 스크립트를 여러 번,기 위해 요소의 출력에서 변경됩니다. keys %h 의 목록을 반환합니다 키 해쉬에서 임의의 순서입니다. 필요하신 경우에는 순서는 항상 같은,예를 들어 사용할 수 있습니다 분류 foreach my $key (sort keys %h) {.

을 통과 해쉬를 사용하여 whileeach

다른 방법으로 회피하는 전체 해쉬를 사용하여 루프 while 와 핵심 단어 each. 여기에는 코드 이는 이전 예제:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";
}

each %h 의 목록을 반환하는 두 가지 요소—이 해시키고로 해당 값입니다. 정확히 동일 경우에 keys 는 순서 each 반환 값 쌍을 정의되어 있지 않습니다. 다른 실행의 동일 프로그램이 반환됩니다 쌍에서 다른 주문입니다.

우리는 할당 값을 반환되 each 에서 변수입니다. each 있는 기억의 쌍을 이 해시 그 주어졌 다음 사용하는 시간을 반환하는 다른 값 쌍으로 이루어져 있습니다. 이 때까지 계속됩니다 each 반환하지 않는 모든 쌍,그것은 빈 목록을 반환. 동 each 반환하는 부부의 가치,실행하는 몸의 while 주에 한 번,그것은 반환 빈 목록 사이클 while이 완료됩니다.

값을 변경하에서 해시

을 사용할 때 foreach 사이클 keys %h 일 은 한 번만 실행됩니다. 을 사용할 때 while주기 each 일 에서 수행된 각 반복.

로 확장 이전 문제리뿐만 아니라 표시의 모든 요소를 이 해시이지만,또한 교체합니다. 그것은 절대적으로 문제 없이 사용하는 경우 foreachkeys:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
    $h{ $key . $key } = $h{$key};
    delete $h{$key};
}

print Dumper \%h;

출력 프로그램의:

asdf - Hello
a - 1
b - 20
$VAR1 = {
          'bb' => 20,
          'aa' => 1,
          'asdfasdf' => 'Hello'
        };

그것은 작동하지 않을 때 사용하 each:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";

    # error!
    $h{ $key . $key } = $value;
    delete $h{$key};
}

print Dumper \%h;

이 프로그램을 실행하면 화면에 나타납니다 다음과 같습니다.

Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
b - 20
bb - 20
bbbb - 20
asdf - Hello
$VAR1 = {
          'asdfasdf' => 'Hello',
          'bbbbbbbb' => 20,
          'a' => 1
        };

each 을 반환되는 값 쌍에서 해시,그리고 우리는 변경이다. 은 다음과 같은 루프 반복하고 each환 부부의 수정,그리고 그것을 반환 할 수 있습니터링을 다만 추가됩니다.

그렇다면 우회로 해시 필요한 변경은 그것을 사용해야 합 foreachkeys. 사용하는 경우 whileeach 프로그램이 올바르게 작동하지 않습니다.

관련 주제

다른 기사