문자열 나누기

Perl 프로그램에서 문자열의 치환만큼 유용한 도구가 바로 이 split함수 입니다. 아주 간단한 함수 호출 한 번으로 문자열 - 대개는 데이타의 문자열 형태 - 을 손쉽게 나누어 줍니다.
# split.pl

$theData = "Jongpil+male+32+Seoul, Korea";

@dataArray = split( /\+/, $theData ); # +는 특수효과가 있습니다.
                                      # 따라서 \ 로 escape합니다.
print "$theData\n@dataArray\n";  # 배열을 따옴표 ""에 넣고 print
                                 # 하면 요소간에 공백이 한자씩
                                 # 들어간다 했지요 ?
split( /\+/, $theData )는 $theData에 있는 문자열을 '+'를 기준으로 나누어 배열에 저장하라는 의미입니다. 위의 예제에서 @dataArray는 ( "Jongpil", "male", "32", "Seoul, Korea" )의 형태를 갖게 됩니다.

그러면 이런 경우는 어떤 결과가 올까요 ?

$theData = "Jongpil++male+32+++Seoul, Korea"; # 겹쳐진 +들
@dataArray = split( /\+/, $theData );
@dataArray는 ( "Jongpil", "", "male", "32", "", "", "Seoul, Korea" )의 형태를 갖게 됩니다.
이런 결과를 올바른것으로 받아들일 경우도 있겠지요. 그러나 몇 개의 분리자가 겹쳐도 하나로 인식되게 하고 싶은 때에는 조금 진전된 기능을 이용합니다. 새로운것은 아닙니다.
@dataArray = split( /\++/, $theData );
문자열의 일치에서 ?, *, +의 기능에 대해 이야기 했었지요 ?
바로 위의 \++는 +기호(앞의것)를 이용하여 분리하되 +가 '하나 또는 그 이상'의 갯수이더라도 하나인 것과 동일하게 인식한다(뒤의 +부호)는 의미입니다. 따라서 분리할 문장내에 +가 몇개 겹쳐있어도 공백문자열이 배열에 할당되는 일이 없이@dataArray는 ( "Jongpil", "male", "32", "Seoul, Korea" )의 형태를 갖게 됩니다.
또 앞의 + 부호의 앞에 \부호가 붙은것은 +가 뒤의 + 부호처럼 특수한 의미를 지닌 문자이기에, 특수 부호로서가 아니라 + 부호 그자체로서 인식되게 하기위한 것입니다.

다음 예제를 보시면 더욱 확실하게 알 수 있을겁니다.

# arrsplit.pl

@theData = (
  "Jongpil    math     75",
  "Inhyon     math     90",
  "Jungkwang  english 100"
);

foreach (@theData) {      # foreach $_ (@theData) {
  print;                  # print $_;
  print "\n";             # foreach, $_ 기억하시죠 ?
}

@tempArr;

foreach (@theData) {         # foreach (@theData) {
  @tempArr = split( / +/ );  #   @tempArr = split( / +/, $_ );
  printf( "%-10s %-7s %3s\n",
           $tempArr[0], $tempArr[1], $tempArr[2] );
}
위에 새로운 함수가 하나 나와 있군요. 물론 C, C++ 프로그래머들에게는 익숙한 것이지만요.

printf함수는 형식문자열 (위의 경우 "%-10s %-7s %3s\n" )의 요구에 맞추어 뒤의 변수들( $tempArr[0], $tempArr[1], $tempArr[2] )을 일정한 형식대로 출력하는 함수입니다. 위의 경우 %-10s는 문자열(s, string)을 10자의 폭으로 왼쪽(-)부터 쓰되 남는 공간 (Jongpil의 경우 3)은 공백으로 채우라는 의미입니다. %-7s는 7자 넓이인것은 미루어 짐작하시겠고, %3s는 '-'표시가 없으므로 왼 쪽이 아닌 오른 쪽에 맞추어 출력한다는 뜻입니다.

printf에 대한 간단한 설명

문장구조:      printf FILEHANDLE LIST
LIST의 구조:   "형식 지정 문자열", [일반변수 [, 일반변수 [, ..]]] 
형식 지정 문자열: 이 문자열은 뒤에 따라오는 변수(들)를 어떤식으로 출력할 것인지를 지정해 주는 문자열입니다. 변수를 대치 시킨다는 명령으로 인식되는 % 부호, 출력될 변수의 형식에 따라 s, d, f, 출력할 문자폭을 지정해 주기위한 변수형식 지정자 앞의 숫자, 필요에 따른 - 부호, 등으로 구성됩니다.
s      문자열을 출력하고자 할 때 사용됩니다.  "Hello Mr.Kim"
d      숫자를 정수 형태로 출력하고자 할 때 사용됩니다. 25
f      숫자를 실수 형태로 출력하고자 할 때 사용됩니다. 25.735
% 부호 뒤, 그리고 지정자인 s, d, f의 앞에 숫자가 들어가면 이 숫자는 출력될 문자가 총 몇 글자의 폭을 차지할지 결정합니다. 즉 %10s는 문자열을 영문자 10자폭으로 출력한다는 의미입니다. 또 %12d는 변수에 지정된 숫자를 정수형태로 총 10자 폭으로 출력한다는 뜻입니다. 실수의 경우에는 총 문자폭과 더불어 소숫점 이하의 부분을 몇 단위까지 포기할 것인지 지정이 가능합니다. %8.3f는 총 8자의 문자폭에 출력하되 소숫점 이하는 3개폭으로 하여 빈 공간의 경우는 0으로 채워 출력하라는 의미입니다. 즉 0.3의 경우
"   0.300"
으로 출력됩니다.

문자폭에 맞추어 출력될 때, 문자열, 숫자 등은 해당 폭의 맨 오른 쪽에 붙어서 출력됩니다. 이런 결과를 원치 않고 출력이 왼 쪽에 붙어서 되길 바랄때는 %표시 바로 다음에 '-'부호를 더합니다.

숫자의 경우, 숫자의 앞을 공백이 아닌 0으로 채우고자 할 경우에는 문자폭 지정시 그 앞에 0을 덧붙입니다. 즉, %08.3f, %010d 등과 같이 합니다.

설명은 조금 어지러운 듯도 합니다. 쉽게 알 수 있는 방법을 알려드리면, 직접 실험해보시라는 것입니다. 직접 해보시고 출력을 보시면 모든것이 손에 잡힙니다.

printf( "|%-15s|%04d|%10.3f|\n", "Thank you", 50, 524.62 );

이전 | 목록 | 다음
Comments