2010-06-15 3 views
7

Perl에서 해시 참조 목록이 있고 각 입력란에 특정 입력란이 있어야한다고 가정 해 봅시다. foofoo의 모든 매핑을 포함하는 목록을 만들고 싶습니다. foo을 포함하지 않는 해시가 있으면 프로세스가 실패해야합니다.Perl, 모든 해시 값 가져 오기

@hash_list = (
{foo=>1}, 
{foo=>2} 
); 

my @list =(); 
foreach my $item (@hash_list) { 
    push(@list,$item->{foo}); 
} 

#list should be (1,2); 

Perl에서 좀 더 간결한 방법이 있습니까?

+1

매핑 목록을 만들지 않고 각각의 해시'foo' 값으로 구성된 목록을 만들고 있습니다. 코드 예제는 '프로세스 실패'와 아무 관련이 없으므로 단지 더 간결한 것을 요구하는 것이 아닙니다. –

+1

일반적으로 :'foreach ... {... push ..} '를 할 때마다 map이나 grep을 사용하여 코드를 짧고 단순하게 만들 수 있습니다. – Ether

답변

6

예. 거기있다.

my @list = map { 
    exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo' 
    } 
    @hash_list 
; 
+0

이와 같은 복잡한지도 표현식의 경우 일반적으로 표현식이 –

+0

인 +1이 아닌 블록 구문을 사용하여 읽는 것이 더 쉽습니다. 짧은 표현식에 항상 맨손 구문을 사용합니다. 블록을 얻는 것은 arrayref를 반환하는 맵의 경우입니다 :'map [...] => ...' –

0
if (@hash_list != grep { exists $_->{foo} } @hash_list) { 
    # test failed 
} 
1

에반의 대답은 가까이 있지만, foo는의 값보다는 hashrefs를 반환합니다.

my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list 
+0

그래,이 문제를 해결했습니다. 그리고 나는 또한 그것을 죽게 만들었고, 그의 규범과 그의 질문 사이에는 단절이있었습니다. 또한 한 루프에서이 작업을 수행 할 수 있습니다. –

2

이에 대한지도 기능을 사용할 수 있습니다

@hash_list = (
{foo=>1}, 
{foo=>2} 
); 

@list = map($_->{foo}, @hash_list); 

맵은 두 번째 인수의 모든 요소를 ​​통해 첫 번째 인수에 기능을 적용한다.

grep도 목록의 요소를 필터링하고 동일한 방식으로 작동합니다.