15 번째 수정본
-
- 1. 하나의 스트링을 쪼개어서 배열로 만들기
-
-
- 1.1. split에 lookaround를 사용하여 특수한 경우가 생기지 않게 하라
-
- 1.2. split의 특별한 케이스
-
2. 하나의 스트링을 인코딩에 관계없이 일정 갯수의 문자로 나누기
-
1. 하나의 스트링을 쪼개어서 배열로 만들기
@변수 = split( / 구분자 /, $변수);
- $변수의 내용을 구분자에 의해 분리하여 배열을 반환한다.
- 구분자는 /정규표현식 사용가능
@변수 = split( / (구분자) /, $변수);
- 구분자에 괄호가 들어가면 매치되는 구분자 역시 배열의 원소가 된다.
1.1. split에 lookaround를 사용하여 특수한 경우가 생기지 않게 하라
1.2. split의 특별한 케이스
split 에 구분자로 주어지는 패턴이 다음과 같은 경우는 특별하게 동작한다:
- 빈 패턴
//
은 문자열을 캐릭터들로 쪼갠다.
- 빈 스트링, zero-width로 매치되는 패턴(
?
, *
, lookaround 등을 사용한)도 문자열을 캐릭터들로 쪼갠다.
- 따옴표로 둘러쌓인 단일 스페이스
' '
또는 " "
는 공백을 기준으로 문자열을 분리하되, 제일 앞에 있는 빈 필드는 버린다.
- 앵커
/^/
는 문자열을 라인 단위로 쪼갠다. (정확히 이 형태일 때만 그렇고, /^(?=.)/
와 같이 패턴에 다른 게 섞인다면 - 설령 제대로 매치되더라도 - 동작하지 않는다. 이 때는 패턴에 /m
플래그를 붙여주어야 한다)
my $str = ' Buster and Mimi';
print join(":", split //, $str);
print join(":", split /z*/, $str);
print join(":", split / /, $str);
print join(":", split ' ', $str);
$str = "Line 1\nLine 2\nLine 3";
print join(":", split /^/, $str);
2. 하나의 스트링을 인코딩에 관계없이 일정 갯수의 문자로 나누기
2007년에 끙끙댔던 문제인데, 막상 답을 알고 나니 매우 간단해져서, 과거 내용은 삭제함
- Perl 5.8 이후로는, Encode 모듈이 있으므로, 문자열을 일단 decode하고 나면 한글이든 영문이든 어떤 캐릭터든 "글자 한 개"로 간주되니까 substr 을 쓰든 정규표현식을 쓰든 그냥 쪼개면 된다.
use Encode;
my $str = decode("cp949", "English와 한글");
my $length = length($str);
for (my $i = 1; $i < $length; $i++) {
printf "%2d : ", $i;
print "[",
encode("cp949", substr($str, 0, $i)),
"] [",
encode("cp949", substr($str, $i)),
"]\n";
}
1 : [E] [nglish와 한글]
2 : [En] [glish와 한글]
3 : [Eng] [lish와 한글]
4 : [Engl] [ish와 한글]
5 : [Engli] [sh와 한글]
6 : [Englis] [h와 한글]
7 : [English] [와 한글]
8 : [English와] [ 한글]
9 : [English와 ] [한글]
10 : [English와 한] [글]
- Perl 5.6과 그 이전 버전에서는 (굳이 그 오래된 버전을 써야 한다면) Text::Iconv 모듈을 사용해서 UTF-16 등 한 문자가 2바이트로 고정된 인코딩으로 바꾸고, 2바이트 단위로 처리한 다음에 다시 원래 인코딩으로 바꿔주면 되겠다.
기타
컴퓨터분류
<trackbackreceived>