셋째 날: CPAN에서 만남을 추구하면 안되는 걸까 Vol. 1

저자

@JEEN_LEE - Bool Stack NG-near. 위대한 지도자 동지 남편. 한이, 유이 애비. 시간의 딸(?)

시작하며

열심히 일하다보면 뜻대로 쉽게 풀리지 않는 일들에 휘둘리기 마련입니다. 그렇지 않으면 어떻게 돌아가게는 해놓고 나중에 다시 보면 뭔가 찜찜한 느낌이 들기도 하죠. '아, 내가 왜 이런 걸 주업으로 삼아서 이러고 있나' 싶기도 합니다. 이런 후레시한 네거티브향이 풀풀 풍길 때에 우리는 쉬이 뜻하고 있던 '만남'을 추구합니다.

그러면 문제는 뭔가?

IT 강국에서 컨텐츠 강국으로 발돋움하는 헬조센. 그리고 우리 사장님은 그런 곳에서 사업을 벌이고 있습니다. 사장님이 줏어오신 컨텐츠는 우리가 정리해서 뿌려야 되죠. 컨텐츠 제공자님께서 주신 컨텐츠와 관련 데이터를 받아봅니다.

던전에서 천 번을 휘둘러야 레벨업을 한다 3화
던전에서 천 번을 휘둘러야 레벨업을 한다 1화
던전에서 천 번을 휘둘러야 레벨업을 한다 4화
던전에서 천 번을 휘둘러야 레벨업을 한다 8화
던전에서 천 번을 휘둘러야 레벨업을 한다 2화
...
던전에서 천 번을 휘둘러야 레벨업을 한다 24화
...

아니 뭔가 데이터가 개차반입니다. 제대로 된(!) 데이터를 달라고 컨텐츠 제공자님에게 요청을 넣 어봐도 뭐 거기도 제대로 응해줄 기분이 아닌 것 같습니다. 거대한 분노가 휘몰아 칩니다만 이런 짤을 보고 마음을 가라앉힙니다.

불평하지마 그림 1. 불평하지마 (원본)

뭐가 문제겠어요. 그냥 뭐 sort() 한 번 돌려서 DB 때려넣으면 되는 그런 일 아니겠어요? 그래서 단조롭게 코드를 만들어 넣습니다.

use v5.22; # 자신의 펄에 맞는 버전을 사용하면 됩니다.

my @titles = (
    "던전에서 천 번을 휘둘러야 레벨업을 한다 3화",
    "던전에서 천 번을 휘둘러야 레벨업을 한다 1화",
    "던전에서 천 번을 휘둘러야 레벨업을 한다 4화",
    "던전에서 천 번을 휘둘러야 레벨업을 한다 8화",
    "던전에서 천 번을 휘둘러야 레벨업을 한다 2화",
    ...
);

for my $title (sort @titles) { say $title }

그냥 되는 거잖...

던전에서 천 번을 휘둘러야 레벨업을 한다 10화
던전에서 천 번을 휘둘러야 레벨업을 한다 11화
던전에서 천 번을 휘둘러야 레벨업을 한다 12화
던전에서 천 번을 휘둘러야 레벨업을 한다 1화
던전에서 천 번을 휘둘러야 레벨업을 한다 2화
던전에서 천 번을 휘둘러야 레벨업을 한다 3화    
...

어!?

...

아! 망할 컴퓨터가 알아듣기 힘들었나봐요. 크읏, 하지만 불평해서는 안되는 것입니다. 컴퓨터는 일을 하고 있는 것이니까요. 문제는 정렬할 데이터가 단순 숫자나 문자열만이 아닌, 이 두 상황의 교집합에 대응해야 하는 것입니다. 그럼 어떻게!? 매일같이 오는 데이터 속에서 가장 효율적인 방법은 갑(컨텐츠 제공자) 을 족치는 것이죠. 하지만 가능할 리가 없습니다. 아, 그러면 좀 더 머리를 써보죠.

use v5.22; # 자신의 펄에 맞는 버전을 사용하면 됩니다.

my @titles = (
    ...
);

sub filter {
    my $text  = shift;

    ( my $number = $text ) =~ s/[^\d]+//g;

    ($number, $text);
}

for my $r (
    sort { $a->[0] <=> $b->[0] }
    map { [ filter($_) ] }
    @titles
)
{
    say $r->[1];
}

느긋하게 결과를 기다립니다.

...
던전에서 천 번을 휘둘러야 레벨업을 한다 8화
던전에서 천 번을 휘둘러야 레벨업을 한다 9화
던전에서 천 번을 휘둘러야 레벨업을 한다 10화
던전에서 천 번을 휘둘러야 레벨업을 한다 11화
던전에서 천 번을 휘둘러야 레벨업을 한다 12화
...

원하는 결과가 나왔습니다. 만세! 이걸로 정시퇴근을 쟁취할 수 있게 되었습니다.

다음 날 아침이 되어 코드 리뷰를 잠깐합니다. 옆자리 A님은 하루에 5천줄 가까이 커밋을 했고, 저는 그냥 5줄도 안되는 거 같습니다. 그냥 이게 내 주업이 아닌가보다 매일 이렇게 코드 리뷰 할 때마다 생각하게 되죠.

드디어 제 차례가 되었습니다.

A: 그거 왜 그렇게 하셨어요?

J: (시작부터 그렇게 나오시겠다?) 그럼 뭐 다른 방법이 있을까요?(물음에는 되물어야지)

A: 그거 그냥 한 줄이면 되는데...

J: (뭐!? 이 원라이너성애자가...) ...(후략)

그리고 저는 코드 리뷰를 통해서 약간의 위궤양 증세와 함께 또다른 방법을 전해들었습니다.

준비물

필요한 모듈은 다음과 같습니다.

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Sort::Naturally

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Sort::Naturally

내츄럴리?

주섬주섬 CPAN 모듈을 주워담아서 돌려봅니다.

use v5.22; # 자신의 펄에 맞는 버전을 사용하면 됩니다.

use Sort::Naturally;

my @titles = (
    ...
);

for my $title ( Sort::Naturally::nsort @titles ) { say $title }

극도로 단순해졌습니다. '맙소사. 내츄럴리 리얼리? 내가 낑낑댄 어제는 뭐였지? 역시 나는 이 일을 주업으로 해서는 안되었나봐'라며 자책합니다.

정리하며

인생과 기사는 모두 상황극의 연속입니다. 위 내용은 실제 업무 환경 및 행태와는 다르오니 부디 오해가 없으시길 바랍니다. 실제로 데이터는 정말 어처구니가 없는 형식으로 올 때가 많기 때문에 그때 그때 적절한 필터링 규칙을 추가하면서 진행하겠지만, 일단은 어느 정도 만족할 만한 결과가 나왔습니다. 위처럼 코드간 단순해진 것도 확인할 수 있죠.

아무튼 Sort::Naturally와는 좋은 만남이 계속되고 있습니다. :-)

blog comments powered by Disqus