2012년 10월 28일 일요일

[Perl programming] map() 함수

map-sort-map 함수를 사용한 배열 처리 기법(Schwartzian transformation)을 가끔 사용하면서도, map의 정확한 사용법을 잘 모르고 있었다. map 함수는 인수로 주어진 배열의 모든 원소에 대하여 작업을 수행한 뒤, 그 결과로 이루어진 새로운 배열을 출력하는 기능을 한다. 다음과 같이 strain 명칭을 원소로 갖고 있는 배열이 있다고 하자.

@org = qw(K-12 BL21 str.168);

각 organism들이 갖고 있는 유전자의 수는 %num이라는 해쉬에 들어있다고 가정하자. 즉 다음과 같이 각 organism의 유전자 수를 반환할 수 있다.

$num{'K-12'} = 4600;

이제 유전자의 수를 한 줄에 프린트하려고 한다. 각 값은 tab으로 구분을 하되, @org 배열에 들어 있는 순서를 따르고 싶다. foreach를 사용한 고전적인 방법을 따른다면,

foreach (@org) {
    print $num{$_}, "\t";
}
print "\n";

이렇게 하면 마지막 값 뒤에 tab이 남는 부작용이 생긴다. 다음과 같이 임시 배열을 사용하면 조금 나아지긴 하지만, 코드가 너무 길어진다.

foreach (@org) {
    push @temp, $num{$_};
}
print join "\t", @temp;
print "\n";


 map function을 쓰면 다음과 같이 간결해진다.

print join ( "\t", map $num{$_}, @orgs) . "\n";

댓글 2개:

aero's blog :

perl에서 array와 hash적용가능한 slice문법을 사용하시면
print join("\t", @nums{@org}), "\n";
처럼 간단하게도 가능합니다.
참고: http://perltraining.com.au/tips/2005-08-19.html

정해영 (Haeyoung JEONG) :

늘 좋은 덧글 남겨주시는군요. 감사합니다...