2012-05-16 5 views
2

나는 해시의 배열이 있습니다Perl에서 해시 배열을 값 배열로 변환하려면 어떻게해야합니까?

my @sports; 
push @sports, { id=>1, name=>'Rugby' }; 
push @sports, { id=>2, name=>'Football' }; 

을 나는 모든 이름 (A CGI 팝업 메뉴에 표시)의 배열을 얻을합니다. 나는이 그렙 문을 사용하여 시도 :

my @names = grep { $_->{name} } @sports; 

하지만 그냥 해시 값의 배열을 반환 ... 그래서

나는 현재 다른로 밀어 모든 값을 반복하는 루프를 사용에 의존하고

정렬.

속도를 높이는 방법이 있습니까?

답변

7

당신은하지 grep, map합니다 관심사; 가독성이 있어야합니다. 물론 효율성은 중요하지만 코드를 간결하고 비밀스럽게 생각하면 프로그램 성능이 향상 될 것이라는 생각에 자신을 빠지게하지 마십시오. 그렇지 않습니다. To assess performance, benchmark your programs.

my (@sports, @names); 
push @sports, { id=>1, name=>'Rugby' }; 
push @names, 'Rugby'; 
push @sports, { id=>2, name=>'Football' }; 
push @names, 'Football'; 

이것은 피할 : 당신이 정말 열심히 당신의 예에서와 같이 @sports의 채우기를 코딩 한 경우

+0

모든 단계를 보여주고 있다는 것을 알고 있지만 임시 변수'@ names'를 건너 뛸 수 있습니다 :'print map $ _-> {name}, @ sports'. –

+0

@briandfoy - 오히려 :'지도 $ _-> {name}, @ sports'로 인쇄하십시오. 그렇지 않으면 모든 스포츠가 하나의'RugbyFootball'에 함께 정리됩니다. 'print for LIST'를 커맨드 라인에서'-l'과 함께 사용합니다 :'perl -lwe "정렬 키 % main ::"'를 출력하십시오. – Lumi

+0

감사! 귀하의 속도 논쟁을 이해합니다 (처리 기간). 나는 그것이 더 적은 타이핑이라고 더 잘 묘사 할 수 있다고 생각한다. 어디에서 데이터를 가져올 지에 따라 이름 배열을 만들기 위해 별도의 장소에 두 개의 루프가 있음을 의미합니다. 지도를 통해 한 곳에서 할 수 있습니다. – skeniver

0
my @sports; 
push @sports, { id=>1, name=>'Rugby' }; 
push @sports, { id=>2, name=>'Football' }; 
foreach(@sports){ 
    push @names, $_->{'name'}; 
} 
foreach(@names){ 
    print "$_\n"; 
} 

아, 죄송합니다. 게시물을 다시 읽으십시오. TBH, 그러나 당신은 그것을 쓰지 만, 나는 내부적으로 루프가 어쨌든 일어나고 있다고 생각한다. 조기에 최적화하려고하지 않으시겠습니까? 성능 문제가 있습니까?

use strict; 
use warnings; 
my @sports; 
push @sports, { id=>1, name=>'Rugby' }; 
push @sports, { id=>2, name=>'Football' }; 
my @names = map $_->{name}, @sports; 
print for @names; 
D:\temp> perl -l m.pl 
Rugby 
Football

그러나이 적어도 상당한 방법으로, 속도와 아무 상관이없는주의, 속도는 기본 안 :

0
for my $i (0 .. $#sports) { 
    print "$sports[$i]{name} \n";  
} 

가리키고 당신은 또한이 솔루션은 간단하다

0

을 통해 루프지도 기능을 사용할 수 있습니다 두 번째 루프는 모두

관련 문제