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개:
perl에서 array와 hash적용가능한 slice문법을 사용하시면
print join("\t", @nums{@org}), "\n";
처럼 간단하게도 가능합니다.
참고: http://perltraining.com.au/tips/2005-08-19.html
늘 좋은 덧글 남겨주시는군요. 감사합니다...
댓글 쓰기