2013-08-22 3 views
3

는 나는 다음과 같다 내가보고하고이왜 Perl 해시 값이 키로 추가 되었습니까?

$read_data{"status"} = 0; 
$read_data{"suffix"} = "_SP"; 
$read_data{"consumption"} = 95; 

같은 키와 값을 구축하기 위해 노력하고 my %read_data =();

해시를 가지고 있고, 나는 내가 뭘 잘못 알아낼 수 없습니다.

Key=status 
Key=0 
Key=suffix 
Key=_SP 
Key=consumption 
Key=95 

나는 당신이 배열 것처럼 해시를 반복 한 것으로 나타났습니다 출력에 의해 판단, 특정하기 위해 코드를 게시를해야하지만

for my $k1 (%read_data) 
{ 
    print "Key=".$k1."\n"; 
} 
+2

입력을 표시했지만 출력을 생성하는 데 사용하는 코드는 표시하지 않았습니다. – Quentin

+0

키 키워드와 디버그 출력을 생성 한 것을 잊어 버렸습니다. OP에서 모두 돌봐. – octopusgrabbus

+1

'사용 데이터 :: 덤퍼; – toolic

답변

6

사이의 관계가있다 배열 및 해시가 표시됩니다.

my %hash = (one => 1, two => 2, three => 3); 

one, two 및`three 인 hree 멤버 해시. 이렇게 :

my %hash = ("one", 1, "two", 2, "three", 3); 

실제로 두 줄은 완전히 똑같은 문장입니다. =>은 하나의 값과 다른 값 사이의 관계를 강조하는 데 사용되는 구문 설탕의 형식입니다. 다시 같은 줄이 있습니다. 난 그냥이 일에 당신의 두뇌와 장난 해요,하지만 이전과 동일한 해시를 생성합니다 여기

my %hash = ("one", 1 => "two", 2 => "three", 3); 

가 동일한 해시 할당하는 또 다른 방법 :

my @array = ("one", 1, "two", 2, "three", 3); 
my %hash = @array; 

을 그리고이 너무도 유효 :

my @array = %hash; 

펄에서 해시와 배열 사이에 밀접한 관계가있다. 해시 컨텍스트에서 배열을 가져 오면 해시가됩니다. 배열 컨텍스트에서 해시를 가져 오면 배열이됩니다. 예를 들어 :

mysub (%hash); 

sub mysub { 
    my %subhash = @_; 
    ... 
} 

이 서브 루틴에 해시를 전달하는 유효한 (권장되지는 않았지만 방식)입니다. 해시는 @_ 배열로 변환 된 다음 서브 루틴의 해시로 다시 변환됩니다.

의이 루프를 살펴 보자 : 당신의 %read_data 해시를 취할 것입니다, 따라서

for my $k1 (%read_data) { 

(...)는 목록/배열 상황입니다 및 및 다음 각 와리스트 문맥에서 그것을 제시 그것의 .

해결 방법은 몇 가지가 있습니다. 하나는 keys을 사용하여 해시의 모든 키를 제거하고 키 배열을 반환하는 것입니다. 이것은 일반적으로 sort과 결합되어 키를 약간의 유사하게 정렬합니다.

for my $k1 (sort keys %read_data) { 

또 다른

는 하나의 키와 하나 개의 값 두 멤버 일련의 배열을 반환 each을 사용하는 것입니다.

+1

"해시 컨텍스트의 배열"같은 것은 없습니다. 'my % hash = @ array'라고하면 해시를 초기화하는 배열을 사용하고 있습니다. –

+0

내가 추가 할 수있는 유일한 것에 대해, 때로는 키를 알 필요가 없으며 순서가 중요하지 않다는 것입니다. 이 경우 ['values'] (http://perldoc.perl.org/functions/values.html)를 반복하면됩니다. –

6

를 사용하여이 인쇄하고; 펄은 당신이이 일을하도록 할 것이지만, 거의 당신이 원하는 것은 결코 아닙니다. 그 키를 얻을 순차적으로 값 것이다 foreach 이상 해시를 사용

foreach my $key (keys %read_data) { 
    my $value = $read_data{$key}; 
    print "$key = $value\n"; 
}; 
3

때문에 그렇게하지 않는 대신, 이런 식으로 뭔가를하려고합니다.

은 나를 위해 일한 :

while (my ($k, $v) = each %read_data) { 
    print "$k = $v\n"; 
} 

(내가 크게 한 후 다시 조회 할 필요가 아니라 해시보다 해시에게 항목을 점점 선호합니다.)