2012-09-19 7 views
1

다음 해시 배열의 크기를 어떻게 구합니까? Perl에서 해시 배열의 크기를 찾으십시오.

나는이 그것을 할 것이라고 생각하지만, 그것은 작동하지 않았다

...

print Dumper scalar $item->{'detail'}; 
$VAR1 = [ 
    { 'content' => undef, 'name' => 'entree', 'url_name' => 'entree' }, 
    { 'content' => undef, 'name' => 'dessert', 'url_name' => 'desert' }, 
    { 'content' => undef, 'name' => 'drink', 'url_name' => 'drink' } 
]; 

또는 내가 크기를 모른 채 해시의 배열의 모든 url_name (앙트레, 사막, 음료)를 인쇄 할 수있는 방법 ?

답변

8

배열 참조가 있습니다.

print scalar @{$item->{'detail'}}; 

을하고 URL을 나열 : 먼저 참조 역 참조, 참조 된 배열의 크기를 얻으려면

my $v = [ 
     { 'content' => undef, 'name' => 'entree', 'url_name' => 'entree' }, 
     { 'content' => undef, 'name' => 'dessert', 'url_name' => 'desert' }, 
     { 'content' => undef, 'name' => 'drink', 'url_name' => 'drink' } 
]; # or $v = $item->{'detail'}; 

foreach my $h (@$v) { 
    print $h->{url_name}, "\n"; 
} 
+0

어느 라인이 있습니까? – perreal

+0

내 실수 ... 그게 완벽하게 작동, 몇 시간을 구해줘. – mamesaye

1

난 당신이 당신이 순서대로 배열 크기를 필요로 생각하는 이유를 모르겠어요 url_name 값을 인쇄하십시오. 그럼에도 불구하고 작동 원리는 다음과 같습니다.

use strict; 
use warnings; 
use Data::Dumper; 

my $v = [ # note that this is a scalar value 
    { 'content' => undef, 'name' => 'entree', 'url_name' => 'entree' }, 
    { 'content' => undef, 'name' => 'dessert', 'url_name' => 'desert' }, 
    { 'content' => undef, 'name' => 'drink', 'url_name' => 'drink' } 
]; 
my $item = { detail => $v };  # recreate your structure $item->{detail} 
my $size = @$v;      # this is how its done with $v 
my $size2 = @{ $item->{detail} }; # and with your original structure 
my @x = map $_->{url_name}, @$v; # extract url_name values 
print Dumper \@x; 

보시다시피

, $item->{detail}$v는 동일합니다. 이 스칼라 값을 Dumper에 직접 입력하면 (이 경우 아무 것도 수행하지 않는 scalar 함수를 통해) 위의 $v에 표시된 인쇄 된 값을 얻게됩니다. 모두 scalarprint으로 사용 된 컨텍스트를 변경하고 목록 컨텍스트가 아닌 스칼라 컨텍스트를 적용합니다. 스칼라 지정 ( $size$size2)을 사용하여 동일한 작업을 수행 할 수 있습니다.

원래 구조체를 사용하는 경우 @{ } 대괄호를 사용하여 그 안에 들어있는 것이 배열 ref임을 perl에 명확히 알릴 필요가 있습니다.

값을 추출하는 것은 map 문을 사용하여 쉽게 수행 할 수 있습니다. 루프로 작동하여 @$v (또는 @{ $item->{detail} })의 모든 값을 반복하고 각 값에 대해 $_->{url_name} 문을 반환합니다.

관련 문제