Str — 내장 문자열 타입

Str — 내장 문자열 타입

문자열을 위한 내장 클래스예요. Str 타입의 객체는 불변(immutable) 이에요. 한 번 만들어진 문자열은 바뀌지 않고, 변경 작업은 항상 새 문자열을 만들어 반환하죠.

출처: Raku Documentation — Str

본문

routine chop

multi method chop(Str:D:)
multi method chop(Str:D: Int() $n)

끝에서 $n개의 문자를 제거한 문자열을 반환해요. 원본 문자열은 변하지 않아요. 위치 인자 $n은 미리 Int로 변환돼요.

say "Whateverable".chop(3.6);  # OUTPUT: «Whatevera␤»
my $string= "Whateverable";
say $string.chop("3");         # OUTPUT: «Whatevera␤»

인자 없이 호출하면 딱 한 문자만 제거해요. 문자열에 제거할 문자 수보다 적은 문자가 있으면 결과는 빈 문자열이 돼요.

routine chomp

multi        chomp(Str:D  --> Str:D)
multi method chomp(Str:D: --> Str:D)

끝에서 논리적 새 줄(NEWLINE 속성을 가진 코드포인트)을 제거한 문자열을 반환해요.

예시:

say chomp("abc\n");       # OUTPUT: «abc␤»
say "def\r\n".chomp;      # OUTPUT: «def␤» NOTE: \r\n is a single grapheme!
say "foo\r".chomp;        # OUTPUT: «foo␤»

method contains

multi method contains(Str:D: Str:D $needle --> Bool)
multi method contains(Str:D: Str:D $needle, Int:D $pos --> Bool)
multi method contains(Str:D: Str:D $needle, :m(:$ignoremark)! --> Bool)
multi method contains(Str:D: Str:D $needle, :i(:$ignorecase)!, :m(:$ignoremark) --> Bool)
multi method contains(Str:D: Str:D $needle, Int:D $pos, :m(:$ignoremark)! --> Bool)
multi method contains(Str:D: Str:D $needle, Int:D $pos, :i(:$ignorecase)!, :m(:$ignoremark) --> Bool)
multi method contains(Str:D: Regex:D $needle --> Bool)
multi method contains(Str:D: Regex:D $needle, Int:D $pos --> Bool)

Str 호출자(여기선 haystack)와 첫 번째 인자(여기선 $needle)를 받아, 문자열의 처음부터 $needle을 찾고, 찾으면 True를 반환해요. 선택 인자 $pos를 주면 haystack을 문자열에서 $pos 문자 위치부터 검색해요.

say "Hello, World".contains('Hello');      # OUTPUT: «True␤»
say "Hello, World".contains('hello');      # OUTPUT: «False␤»
say "Hello, World".contains('Hello', 1);   # OUTPUT: «False␤»
say "Hello, World".contains(',');          # OUTPUT: «True␤»
say "Hello, World".contains(',', 3);       # OUTPUT: «True␤»
say "Hello, World".contains(',', 10);      # OUTPUT: «False␤»

첫 번째 경우, contains가 호출자 문자열의 맨 처음부터 'Hello'를 찾아 True를 반환해요. 세 번째 경우, 'Hello, World'의 두 번째 위치(인덱스 1)부터 찾기 시작했기 때문에 'Hello'를 찾지 못해요.

$needleCool 타입일 수도 있고, 그러면 Str로 강제 변환돼요. 마찬가지로 $posCool일 수 있고, Int로 변환돼요. (기술적으로 이 경우들은 Cool.contains를 거쳐 변환 후 Str.contains를 호출해요.)

say "Hello, 12345".contains(5, "10.0");    # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 $needleRegex일 수도 있어요. 이 경우 contains는 문자열이 그 정규식을 한 번이라도 매치하는지만 빠르게 반환해요. Match 객체는 만들어지지 않아서 비교적 빨라요.

say 'Hello, World'.contains(/\w <?before ','>/);    # OUTPUT: «True␤»
say 'Hello, World'.contains(/\w <?before ','>/, 5); # OUTPUT: «False␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignorecase(또는 :i)를 주면 $needle 검색 시 대문자·소문자·타이틀케이스 구분을 무시해요.

say "Hello, World".contains("world");              # OUTPUT: «False␤»
say "Hello, World".contains("world", :ignorecase); # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignoremark(또는 :m)를 주면 $needle 검색이 기본 문자만 고려하고 결합 악센트 같은 추가 부가 기호는 무시해요.

say "abc".contains("ä");               # OUTPUT: «False␤»
say "abc".contains("ä", :ignoremark);  # OUTPUT: «True␤»

ListArrayStrcoerce되는 방식 때문에 결과가 때로 놀라울 수 있다는 점에 주의하세요.

say <Hello, World>.contains('Hello');    # OUTPUT: «True␤»
say <Hello, World>.contains('Hello', 0); # OUTPUT: «True␤»
say <Hello, World>.contains('Hello', 1); # OUTPUT: «False␤»

traps 문서를 참고하세요.

routine lc

multi        lc(Str:D  --> Str:D)
multi method lc(Str:D: --> Str:D)

문자열의 소문자 버전을 반환해요.

예시:

lc("A"); # OUTPUT: «"a"»
"A".lc;  # OUTPUT: «"a"»

routine uc

multi        uc(Str:D  --> Str:D)
multi method uc(Str:D: --> Str:D)

문자열의 대문자 버전을 반환해요.

routine fc

multi        fc(Str:D  --> Str:D)
multi method fc(Str:D: --> Str:D)

대소문자 구분 없는 문자열 비교에 적합한 Unicode "fold case" 연산을 수행해요. (일반적으로 반환된 문자열은 비교 목적 외에는 별로 쓸모가 없어요.)

routine tc

multi        tc(Str:D  --> Str:D)
multi method tc(Str:D: --> Str:D)

Unicode "titlecase" 연산을 수행해요. 문자열의 첫 문자를 titlecase로 바꾸고, 그 문자가 titlecase 매핑이 없으면 대문자로 바꿔요.

routine tclc

multi        tclc(Str:D  --> Str:D)
multi method tclc(Str:D: --> Str:D)

첫 문자는 titlecase로, 나머지 문자는 모두 소문자로 바꿔요.

routine wordcase

multi        wordcase(Cool $x  --> Str)
multi        wordcase(Str:D $x --> Str)
multi method wordcase(Str:D: :&filter = &tclc, Mu :$where = True --> Str)

$where와 일치하는 모든 단어에 &filter를 적용한 문자열을 반환해요. 기본적으로는 모든 단어의 첫 글자를 대문자로, 나머지 글자들을 소문자로 바꿔요.

method unival

multi method unival(Str:D: --> Numeric)

호출자의 첫 번째 코드포인트가 나타내는 숫자 값 을 반환하거나, 숫자가 아니면 NaN을 반환해요.

say '4'.unival;     # OUTPUT: «4␤»
say '¾'.unival;     # OUTPUT: «0.75␤»
say 'a'.unival;     # OUTPUT: «NaN␤»

method univals

multi method univals(Str:D: --> List)

호출자 문자열의 각 코드포인트가 나타내는 숫자 값들의 목록을 반환하고, 숫자가 아닌 문자에는 NaN을 반환해요.

say "4a¾".univals;  # OUTPUT: «(4 NaN 0.75)␤»

routine chars

multi        chars(Cool  $x --> Int:D)
multi        chars(Str:D $x --> Int:D)
multi        chars(str   $x --> int)
multi method chars(Str:D:   --> Int:D)

문자열의 문자(grapheme) 수를 반환해요. JVM에서는 현재 오류적으로 코드포인트 수를 반환해요.

method encode

multi method encode(Str:D $encoding = 'utf8', :$replacement, Bool() :$translate-nl = False, :$strict)

원본 문자열을 주어진 인코딩과 정규형으로 나타내는 Blob을 반환해요. 실제 반환 타입은 가능한 한 구체적이라서, $str.encode('UTF-8')utf8 객체를, $str.encode('ISO-8859-1')buf8을 반환해요. :translate-nlTrue면 새 줄을 \n에서 \r\n으로 변환하는데, Windows에서만 그렇게 해요. $replacement는 문자를 현재 인코딩에서 표현할 수 없을 때 그 문자를 어떻게 대체할지 나타내고, $strict는 매핑되지 않은 코드포인트를 여전히 디코딩할지 나타내요(예: windows-1252에 존재하지 않는 코드포인트 129).

my $str = "Þor is mighty";
say $str.encode("ascii", :replacement( 'Th') ).decode("ascii");
# OUTPUT: «Thor is mighty␤»

이 경우, 알 수 없는 문자는 Th로 대체돼요. 우리는 ascii 인코딩에서 알 수 없는 문자가 Þ임을 알고 있으므로, 그 라틴 동등물인 Th로 대체하는 거예요. 대체 문자 집합이 없으면 :replacementBool로 이해돼요.

say $str.encode("ascii", :replacement).decode("ascii"); # OUTPUT: «?or is mighty␤»

:replacement가 설정되지 않거나 값이 지정되지 않으면 Error encoding ASCII string: could not encode codepoint 222 오류가 발행돼요 (이 경우 þ가 코드포인트 222이기 때문).

encode가 반환한 Blob은 정규형의 원본 문자열이고, Blob의 각 요소는 바이트이므로, 그 Blob의 크기를 반환하는 메서드를 호출하면 문자열의 바이트 길이를 얻을 수 있어요.

say "þor".encode.bytes; # OUTPUT: «4␤»
say "þor".encode.elems; # OUTPUT: «4␤»

method index

multi method index(Str:D: Cool:D $needle, :i(:$ignorecase), :m(:$ignoremark) --> Int:D)
multi method index(Str:D: Str:D $needle, :i(:$ignorecase), :m(:$ignoremark) --> Int:D)
multi method index(Str:D: Cool:D $needle, Cool:D $pos, :i(:$ignorecase), :m(:$ignoremark) --> Int:D)
multi method index(Str:D: Str:D $needle, Int:D $pos, :i(:$ignorecase), :m(:$ignoremark) --> Int:D)
multi method index(Str:D: @needles --> Int:D)
multi method index(Str:D: @needles, :m(:$ignoremark)! --> Int:D)
multi method index(Str:D: @needles, :i(:$ignorecase)!, :m(:$ignoremark) --> Int:D)

(제공된다면) $pos부터 시작해 문자열에서 $needle을 검색해요. $needle을 찾은 오프셋을 반환하고, 찾지 못하면 Nil을 반환해요.

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignorecase(또는 :i)를 주면 $needle 검색 시 대문자·소문자·타이틀케이스 구분을 무시해요. 또한 선택 명명 인자 :ignoremark(또는 :m)를 주면 $needle 검색이 기본 문자만 고려하고 결합 악센트 같은 부가 기호는 무시해요.

Rakudo 2020.05 릴리스부터 index는 검색할 needle들의 목록을 받아서, 찾은 가장 낮은 인덱스나 Nil을 반환해요.

예시:

say "Camelia is a butterfly".index("a");         # OUTPUT: «1␤»
say "Camelia is a butterfly".index("a", 2);      # OUTPUT: «6␤»
say "Camelia is a butterfly".index("er");        # OUTPUT: «17␤»
say "Camelia is a butterfly".index("Camel");     # OUTPUT: «0␤»
say "Camelia is a butterfly".index("Onion");     # OUTPUT: «Nil␤»
say "Camelia is a butterfly".index(<a e i u>);   # OUTPUT: «1␤»
say "Camelia is a butterfly".index(<a c>, :i);   # OUTPUT: «0␤»
say "Camelia is a butterfly".index(('w', 'x'));  # OUTPUT: «Nil␤»

say "Hello, World".index("world");               # OUTPUT: «Nil␤»
say "Hello, World".index("world", :ignorecase);  # OUTPUT: «7␤»

say "abc".index("ä");                            # OUTPUT: «Nil␤»
say "abc".index("ä", :ignoremark);               # OUTPUT: «0␤»
say "abc".index("x").defined ?? 'OK' !! 'NOT';   # OUTPUT: «NOT␤»

sub 포함한 index의 다른 형태는 Cool에서 상속돼요.

routine rindex

multi method rindex(Str:D: Str:D $needle --> Int:D)
multi method rindex(Str:D: Str:D $needle, Int:D $pos --> Int:D)
multi method rindex(Str:D: @needles --> Int:D)

$pos를 넘지 않는 문자열 내 $needle마지막 위치를 반환해요. $needle을 찾지 못하면 Nil을 반환해요.

Rakudo 2020.05 릴리스부터 rindex는 needle들의 목록을 받아서, 찾은 가장 높은 인덱스나 Nil을 반환해요.

예시:

say "aardvark".rindex: "a";       # OUTPUT: «5␤»
say "aardvark".rindex: "a", 0;    # OUTPUT: «0␤
say "aardvark".rindex: "t";       # OUTPUT: «Nil␤»
say "aardvark".rindex: <d v k>;   # OUTPUT: «7␤»

sub 포함한 rindex의 다른 형태는 Cool에서 상속돼요.

method indices

multi method indices(Str:D: Str:D $needle, :i(:$ignorecase), :m(:$ignoremark), :$overlap --> List:D)
multi method indices(Str:D: Str:D $needle, Int:D $start, :i(:$ignorecase), :m(:$ignoremark), :$overlap --> List:D)

$start(지정하지 않으면 0)부터 시작해 문자열에서 $needle모든 출현을 검색하고, $needle을 찾은 모든 오프셋의 List를 반환하거나, 찾지 못하면 빈 리스트를 반환해요.

선택 인자 :overlap을 지정하면 검색이 이전 매치 바로 다음 인덱스에서 계속되고, 그렇지 않으면 이전 매치 이후에서 계속돼요.

say "banana".indices("a");              # OUTPUT: «(1 3 5)␤»
say "banana".indices("ana");            # OUTPUT: «(1)␤»
say "banana".indices("ana", :overlap);  # OUTPUT: «(1 3)␤»
say "banana".indices("ana", 2);         # OUTPUT: «(3)␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignorecase(또는 :i)를 주면 $needle 검색 시 대문자·소문자·타이틀케이스 구분을 무시해요.

say "banAna".indices("a");              # OUTPUT:«(1 5)␤»
say "banAna".indices("a", :ignorecase); # OUTPUT:«(1 3 5)␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignoremark(또는 :m)를 주면 $needle 검색이 기본 문자만 고려하고 결합 악센트 같은 부가 기호는 무시해요.

say "tête-à-tête".indices("te");              # OUTPUT:«(2 9)␤»
say "tête-à-tête".indices("te", :ignoremark); # OUTPUT:«(0 2 7 9)␤»

method match

method match($pat, :continue(:$c), :pos(:$p), :global(:$g), :overlap(:$ov), :exhaustive(:$ex), :st(:$nd), :rd(:$th), :$nth, :$x --> Match)

문자열을 $pat에 대해 매치하고, 성공하면 Match 객체를 반환하며, 아니면 Nil을 반환해요. 매치는 기본 매치 변수 $/에 저장돼요. $patRegex 객체가 아니면, match는 인자를 Str로 변환한 뒤 $pat에 대해 리터럴 매치를 수행해요.

매치 방식을 바꾸는 선택 명명 인자들을 여럿 지정할 수 있어요.

  • :continue

:continue 부사는 정규식이 검색을 시작할 위치를 인자로 받아요. :c에 위치가 지정되지 않으면 $/이 설정되지 않은 경우 0으로, 설정된 경우에는 $/.to로 기본 설정돼요.

  • :pos

위치를 인자로 받아요. :continue와 달리 그 위치에서 정규식이 매치되지 않으면 실패해요.

  • :global

매치 하나만 찾아 Match 객체를 반환하는 대신, 겹치지 않는 모든 매치를 찾아 List로 반환해요.

  • :overlap

겹치는 매치를 포함해 모든 매치를 찾되, 각 시작 위치에서 매치 하나만 반환해요.

  • :exhaustive

겹치는 매치와 같은 위치에서 시작하는 매치를 포함해 정규식의 가능한 모든 매치를 찾아요.

  • :st, :nd, :rd, :nth

문자열에서 n번째 매치를 반환해요. 인자는 Numeric이거나 단조 증가하는 숫자를 만드는 Iterable일 수 있어요. Iterable은 lazy하게 reified되고, 단조 증가하지 않는 시퀀스를 만나면 예외가 던져져요.

Iterable 인자를 주면 반환 값과 $/ 변수는 (아마 빈) Match 객체들의 List로 설정돼요.

  • :x

반환할 매치 수를 인자로 받고, 지정된 매치 수에 도달하면 멈춰요. 값은 Numeric이나 Range여야 하며, 다른 값은 X::Str::Match::x 예외를 담은 Failure를 반환하게 해요.

예시:

say "properly".match('perl');                     # OUTPUT: «「perl」␤»
say "properly".match(/p.../);                     # OUTPUT: «「prop」␤»
say "1 2 3".match([1,2,3]);                       # OUTPUT: «「1 2 3」␤»
say "a1xa2".match(/a./, :continue(2));            # OUTPUT: «「a2」␤»
say "abracadabra".match(/ a .* a /, :exhaustive);
# OUTPUT: «(「abracadabra」 「abracada」 「abraca」 「abra」 「acadabra」 「acada」 「aca」 「adabra」 「ada」 「abra」)␤»
say 'several words here'.match(/\w+/,:global);    # OUTPUT: «(「several」 「words」 「here」)␤»
say 'abcdef'.match(/.*/, :pos(2));                # OUTPUT: «「cdef」␤»
say "foo[bar][baz]".match(/../, :1st);            # OUTPUT: «「fo」␤»
say "foo[bar][baz]".match(/../, :2nd);            # OUTPUT: «「o[」␤»
say "foo[bar][baz]".match(/../, :3rd);            # OUTPUT: «「ba」␤»
say "foo[bar][baz]".match(/../, :4th);            # OUTPUT: «「r]」␤»
say "foo[bar][baz]bada".match('ba', :x(2));       # OUTPUT: «(「ba」 「ba」)␤»

method Numeric

method Numeric(Str:D: --> Numeric:D)

val 루틴과 동등한 의미로 문자열을 Numeric으로 강제 변환해요. 숫자로의 변환이 불가능하면 X::Str::Numeric으로 fails해요.

속성 Nd를 가진 Unicode 문자와 앞뒤 공백만 허용되며, 빈 문자열은 0으로 강제 변환되는 특별한 경우예요. 합성 코드포인트(예: "7\x[308]")는 금지돼요.

NlNo 문자는 언어에서 숫자 리터럴로 쓸 수 있지만, Str.Numeric을 통한 변환은 의도적으로 실패해요. 합성 숫자(숫자와 분음 부호로 구성된 것)도 마찬가지예요. 그런 문자를 Numeric으로 변환해야 한다면 unival을 참고하세요. +, -, Unicode MINUS SIGN 는 모두 허용돼요.


" −33".Numeric;       # OUTPUT: «-33␤»

method Num

method Num(Str:D: --> Num:D)

Str.Numeric과 같은 규칙으로 문자열을 Num으로 강제 변환하며, 음의 영(-0e0)과 양의 영(0e0)을 처리해요.

my Str $s = "-0/5";
say (.self, .^name) given $s.Numeric;  # OUTPUT: «(0 Rat)␤»
say (.self, .^name) given $s.Num;      # OUTPUT: «(-0 Num)␤»

method Int

method Int(Str:D: --> Int:D)

Str.Numeric과 같은 규칙으로 문자열을 Int로 강제 변환해요.

method Rat

method Rat(Str:D: --> Rational:D)

Str.Numeric과 같은 규칙으로 문자열을 Rat 객체로 강제 변환해요. 분모가 64비트보다 커도 유지되며 Num으로의 열화는 발생하지 않아요.

method Bool

method Bool(Str:D: --> Bool:D)

문자열이 비어 있으면 False를, 아니면 True를 반환해요.

routine parse-base

multi        parse-base(Str:D $num, Int:D $radix --> Numeric)
multi method parse-base(Str:D $num: Int:D $radix --> Numeric)

base의 반대 연산을 수행해요. $radix 진법의 숫자를 담은 문자열을 그 Numeric 동등물로 변환해요. radix가 2..36 범위를 벗어나면, 또는 파싱하는 문자열이 지정된 진법에 유효하지 않은 문자를 포함하면 fail해요.

1337.base(32).parse-base(32).say; # OUTPUT: «1337␤»
'Raku'.parse-base(36).say;        # OUTPUT: «1273422␤»
'FF.DD'.parse-base(16).say;       # OUTPUT: «255.863281␤»

참고: 숫자 리터럴 문법

routine parse-names

sub    parse-names(Str:D $names  --> Str:D)
method parse-names(Str:D $names: --> Str:D)

폐기됨(DEPRECATED). 대신 uniparse를 쓰세요. Rakudo 구현에서 이름이 바뀌기 전 존재 가능성 증명용으로 존재했으며, 6.e 언어가 릴리스되면 제거될 거예요.

routine uniparse

sub    uniparse(Str:D $names  --> Str:D)
method uniparse(Str:D $names: --> Str:D)

쉼표로 구분된 Unicode 문자 이름 문자열을 받아 그 문자들로 구성된 문자열을 반환해요. 문자의 이름이 비어 있거나 인식되지 않으면 fail해요. 문자 이름 주변의 공백은 무시돼요.

say "I {uniparse 'TWO HEARTS'} Raku"; # OUTPUT: «I 💕 Raku␤»
'TWO HEARTS, BUTTERFLY'.uniparse.say; # OUTPUT: «💕🦋␤»

반대 방향(단일 코드포인트 및 다중 코드포인트)으로 동작하는 루틴은 uninameuninames를 참고하세요.

문자열 보간의 \c[...] 구성과 달리, uniparse는 십진 숫자 값을 받지 않는다는 점을 주의하세요. 그런 값은 chr 루틴으로 변환해요.

say "\c[1337]"; # OUTPUT: «Թ␤»
say '1337'.chr; # OUTPUT: «Թ␤»

참고: 2017.12에서 표준화되기 전에는 이 루틴이 작업명 parse-names로 알려져 있었어요. 이 명칭은 6.e 버전에서 제거될 거예요.

method samecase

multi method samecase(Str:D: Str:D $pattern --> Str:D)

각 문자의 대소문자 정보가 $pattern에 따라 바뀐 호출자의 복사본을 반환해요.

참고: 패턴 문자열은 대문자, 소문자, 대소문자 없음(caseless) 세 종류의 문자를 포함할 수 있어요. $pattern에서의 특정 문자의 대소문자 정보가 결과에서 대응하는 문자의 대소문자를 결정해요.

호출자가 $pattern보다 길면, $pattern의 마지막 문자의 대소문자 정보가 호출자의 나머지 문자들에 적용돼요.

say "raKu".samecase("A_a_"); # OUTPUT: «Raku␤»
say "rAKU".samecase("Ab");   # OUTPUT: «Raku␤»

routine split

multi        split(  Str:D $delimiter, Str:D $input, $limit = Inf,
  :$skip-empty, :$v, :$k, :$kv, :$p)
multi        split(Regex:D $delimiter, Str:D $input, $limit = Inf,
  :$skip-empty, :$v, :$k, :$kv, :$p)
multi        split(List:D $delimiters, Str:D $input, $limit = Inf,
  :$skip-empty, :$v, :$k, :$kv, :$p)
multi method split(Str:D:   Str:D $delimiter, $limit = Inf,
  :$skip-empty, :$v, :$k, :$kv, :$p)
multi method split(Str:D: Regex:D $delimiter, $limit = Inf,
  :$skip-empty, :$v, :$k, :$kv, :$p)
multi method split(Str:D: List:D $delimiters, $limit = Inf,
  :$skip-empty, :$v, :$k, :$kv, :$p)

문자열에서 찾은 구분자에 기반해 문자열을 조각들로 분할해요.

$delimiter가 문자열이면 문자 그대로 사용돼요. 빈 문자열은 효과적으로 문자열의 모든 문자를 (앞과 뒤의 빈 문자열과 함께) 별도로 반환해요.

$delimiterRegex로도 넘길 수 있어요.

리스트를 쓰면 각 요소가 위에서 언급한 타입에 따라 구분자로 간주돼요.

선택 $limit은 문자열을 가능하면 몇 개의 세그먼트로 나눠야 하는지를 나타내요. 기본값은 Inf(혹은 *, 보기 나름이지만)로, "가능한 한 많이"를 뜻해요. 음수 한계를 지정하면 의미 있는 결과가 나오지 않는다는 점에 주의하세요.

결과를 바꾸는 선택 명명 인자들을 여럿 지정할 수 있어요. :v, :k, :kv, :p 명명 인자는 발견된 구분자에 대해 특별한 동작을 수행해요.

  • :skip-empty

지정하면 구분자 앞뒤의 빈 문자열을 반환하지 않아요.

  • :v

구분자도 함께 반환해요. 구분자가 정규식이었다면 이는 관련 Match 객체가 돼요. 이 객체는 발견된 구분자 문자열로 문자열화되므로, 그 특정 매치에 대한 추가 정보가 필요 없다면 항상 구분자 문자열이라고 간주해도 돼요.

  • :k

구분자의 인덱스도 함께 반환해요. 구분자 목록이 지정된 경우에만 의미가 있어요. 그 외의 모든 경우에는 0이 돼요.

  • :kv

구분자의 인덱스와 구분자 둘 다 반환해요.

  • :p

구분자의 인덱스와 구분자를 Pair로 반환해요.

예시:

say split(";", "a;b;c").raku;           # OUTPUT: «("a", "b", "c").Seq␤»
say split(";", "a;b;c", :v).raku;       # OUTPUT: «("a", ";", "b", ";", "c").Seq␤»
say split(";", "a;b;c", 2).raku;        # OUTPUT: «("a", "b;c").Seq␤»
say split(";", "a;b;c", 2, :v).raku;    # OUTPUT: «("a", ";", "b;c").Seq␤»
say split(";", "a;b;c,d").raku;         # OUTPUT: «("a", "b", "c,d").Seq␤»
say split(/\;/, "a;b;c,d").raku;        # OUTPUT: «("a", "b", "c,d").Seq␤»
say split(<; ,>, "a;b;c,d").raku;       # OUTPUT: «("a", "b", "c", "d").Seq␤»
say split(/<[;,]>/, "a;b;c,d").raku;    # OUTPUT: «("a", "b", "c", "d").Seq␤»
say split(<; ,>, "a;b;c,d", :k).raku;   # OUTPUT: «("a", 0, "b", 0, "c", 1, "d").Seq␤»
say split(<; ,>, "a;b;c,d", :kv).raku;  # OUTPUT: «("a", 0, ";", "b", 0, ";", "c", 1, ",", "d").Seq␤»

say "".split("x").raku;                 # OUTPUT: «("",).Seq␤»
say "".split("x", :skip-empty).raku;    # OUTPUT: «().Seq␤»

say "abcde".split("").raku;             # OUTPUT: «("", "a", "b", "c", "d", "e", "").Seq␤»
say "abcde".split("",:skip-empty).raku; # OUTPUT: «("a", "b", "c", "d", "e").Seq␤»

routine comb

multi        comb(Str:D   $matcher, Str:D $input, $limit = Inf)
multi        comb(Regex:D $matcher, Str:D $input, $limit = Inf, Bool :$match)
multi        comb(Int:D $size, Str:D $input, $limit = Inf)
multi method comb(Str:D $input:)
multi method comb(Str:D $input: Str:D   $matcher, $limit = Inf)
multi method comb(Str:D $input: Regex:D $matcher, $limit = Inf, Bool :$match)
multi method comb(Str:D $input: Int:D $size, $limit = Inf)

$input에서 $matcher를 검색하고, 최대 $limit 개의 겹치지 않는 매치들로 제한된 Seq를 반환해요.

$matcher가 Regex이면 (Rakudo 2020.01 릴리스부터 사용 가능한) $match가 설정되지 않는 한 각 Match 객체는 Str로 변환돼요.

매처를 제공하지 않으면 매처가 rx/./인 것처럼 문자열의 문자들로 이루어진 Seq를 반환해요.

예시:

say "abc".comb.raku;                 # OUTPUT: «("a", "b", "c").Seq␤»
say "abc".comb(:match).raku;         # OUTPUT: «(「a」 「b」 「c」)␤»
say 'abcdefghijk'.comb(3).raku;      # OUTPUT: «("abc", "def", "ghi", "jk").Seq␤»
say 'abcdefghijk'.comb(3, 2).raku;   # OUTPUT: «("abc", "def").Seq␤»
say comb(/\w/, "a;b;c").raku;        # OUTPUT: «("a", "b", "c").Seq␤»
say comb(/\N/, "a;b;c").raku;        # OUTPUT: «("a", ";", "b", ";", "c").Seq␤»
say comb(/\w/, "a;b;c", 2).raku;     # OUTPUT: «("a", "b").Seq␤»
say comb(/\w\;\w/, "a;b;c", 2).raku; # OUTPUT: «("a;b",).Seq␤»
say comb(/.<(.)>/, "<>[]()").raku;   # OUTPUT: «(">", "]", ")").Seq␤»

매처가 정수 값이면 comb은 매처가 rx/ . ** {1..$matcher} /인 것처럼 동작하되, 훨씬 빠르게 최적화돼요.

Regex 매처는 최상위 캡처를 명시적으로 설정하는 기능을 써서 매치된 텍스트에서 어느 부분이 반환될지 제어할 수 있다는 점을 주의하세요.

multi        comb(Pair:D $rotor, Str:D $input, $limit = Inf, Bool :$partial)
multi method comb(Str:D $input: Pair:D $rotor, $limit = Inf, Bool :$partial)

6.e 언어 버전에서 사용 가능해요 (조기 구현은 Rakudo 2022.12+ 컴파일러에 존재). rotor 쌍(pair)은 가져올 문자의 개수를 키(그 "크기")로, 이후 앞으로 나아갈 "단계"의 수를 값으로 나타내요. 주요 용도는 문자열에서 N-gram을 효율적으로 만드는 방법을 제공하는 거예요. 기본적으로 지정된 크기의 문자열만 생성돼요. :partial 명명 인자를 참값으로 지정하면 이 동작을 덮어쓸 수 있어요.

예시:

say "abcde".comb(3 => -2);             # OUTPUT: «(abc bcd cde)␤»
say "abcde".comb(3 => -2, :partial);   # OUTPUT: «(abc bcd cde de e)␤»
say "abcdefg".comb(3 => -2, 2);        # OUTPUT: «(abc bcd)␤»
say comb(3 => -2, "abcde");            # OUTPUT: «(abc bcd cde)␤»
say comb(5 => -2, "abcde", :partial);  # OUTPUT: «(abc bcd cde de e)␤»
say comb(5 => -2, "abcdefg", 2);       # OUTPUT: «(abc bcd)␤»

routine lines

multi method lines(Str:D: $limit, :$chomp = True)
multi method lines(Str:D: :$chomp = True)

줄들의 Seq를 반환해요. 기본적으로는 $input.comb( / ^^ \N* /, $limit ) 호출과 동일하게 줄 끝을 chomp해요. 줄 끝을 유지하려면 선택 명명 인자 $chompFalse로 설정하세요.

예시:

say lines("a\nb").raku;    # OUTPUT: «("a", "b").Seq␤»
say lines("a\nb").elems;   # OUTPUT: «2␤»
say "a\nb".lines.elems;    # OUTPUT: «2␤»
say "a\n".lines.elems;     # OUTPUT: «1␤»

# Keep line endings
say lines(:!chomp, "a\nb").raku;  # OUTPUT: «("a\n", "b").Seq␤»
say "a\n".lines(:!chomp).elems;   # OUTPUT: «1␤»

$limit 변수를 0이 아니고 Infinity가 아닌 값으로 설정하면 반환되는 줄 수를 제한할 수 있어요.

say <not there yet>.join("\n").lines( 2 ); # OUTPUT: «(not there)␤»

6.d 언어부터 폐기됨(DEPRECATED), :count 인자는 총 줄 수를 반환하는 데 쓰였어요.

say <not there yet>.join("\n").lines( :count ); # OUTPUT: «3␤»

대신 반환된 Seqelems을 호출하세요.

say <not there yet>.join("\n").lines.elems; # OUTPUT: «3␤»

routine words

multi method words(Str:D: $limit)
multi method words(Str:D:)

공백이 아닌 조각들의 Seq를 반환해요. 즉 $input.comb( / \S+ /, $limit ) 호출과 동일해요.

예시:

say "a\nb\n".words.raku;       # OUTPUT: «("a", "b").Seq␤»
say "hello world".words.raku;  # OUTPUT: «("hello", "world").Seq␤»
say "foo:bar".words.raku;      # OUTPUT: «("foo:bar",).Seq␤»
say "foo:bar\tbaz".words.raku; # OUTPUT: «("foo:bar", "baz").Seq␤»

서브루틴으로도 쓸 수 있고, 그 경우 첫 번째 인자가 호출자가 돼요. $limit은 선택이지만, 제공되고(Inf가 아니면) 처음 $limit 개의 단어만 반환해요.

say words("I will be very brief here", 2); # OUTPUT: «(I will)␤»

routine flip

multi        flip(Str:D  --> Str:D)
multi method flip(Str:D: --> Str:D)

문자열을 문자 단위로 뒤집은 문자열을 반환해요.

예시:

"Raku".flip;  # OUTPUT: «ukaR»
"ABBA".flip;  # OUTPUT: «ABBA»

method starts-with

multi method starts-with(Str:D: Str(Cool) $needle, :i(:$ignorecase), :m(:$ignoremark) --> Bool:D)

호출자가 $needle와 동일하거나 $needle으로 시작하면 True를 반환해요.

say "Hello, World".starts-with("Hello");     # OUTPUT: «True␤»
say "https://raku.org/".starts-with('ftp');  # OUTPUT: «False␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignorecase(또는 :i)를 주면 호출자와 $needle의 비교가 대문자·소문자·타이틀케이스 구분을 무시해요.

say "Hello, World".starts-with("hello");              # OUTPUT: «False␤»
say "Hello, World".starts-with("hello", :ignorecase); # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignoremark(또는 :m)를 주면 비교가 기본 문자만 고려하고 결합 악센트 같은 부가 기호는 무시해요.

say "abc".starts-with("ä");              # OUTPUT: «False␤»
say "abc".starts-with("ä", :ignoremark); # OUTPUT: «True␤»

method ends-with

multi method ends-with(Str:D: Str(Cool) $needle, :i(:$ignorecase), :m(:$ignoremark) --> Bool:D)

호출자가 $needle와 동일하거나 $needle으로 끝나면 True를 반환해요.

say "Hello, World".ends-with('Hello');      # OUTPUT: «False␤»
say "Hello, World".ends-with('ld');         # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignorecase(또는 :i)를 주면 호출자와 $needle의 비교가 대문자·소문자·타이틀케이스 구분을 무시해요.

say "Hello, World".ends-with("world");              # OUTPUT: «False␤»
say "Hello, World".ends-with("world", :ignorecase); # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignoremark(또는 :m)를 주면 비교가 기본 문자만 고려하고 결합 악센트 같은 부가 기호는 무시해요.

say "abc".ends-with("ç");              # OUTPUT: «False␤»
say "abc".ends-with("ç", :ignoremark); # OUTPUT: «True␤»

method subst

multi method subst(Str:D: $matcher, $replacement = "", *%options)

$matcher$replacement로 (매치가 없으면 원본 문자열을) 바꾼 호출자 문자열을 반환해요. $replacement가 제공되지 않으면 빈 문자열이 사용돼요(즉, 매치된 문자열들이 제거돼요).

s/matcher/replacement/로 적고 s 뒤나 매처 안쪽에 부사를 붙이는, subst제자리 문법 변형이 있어요.

$matcherRegex이거나 리터럴 Str일 수 있어요. Str이 아닌 Cool 타입의 매처 인자는 리터럴 매치를 위해 Str로 강제 변환돼요. Regex $matcher를 쓰면, $/ 특별 변수가 (매치가 없으면) Nil, Match 객체, 또는 (:g 같은 다중 매치 옵션을 쓰면) Match 객체들의 List로 설정돼요.

리터럴 대체 subst

my $some-string = "Some foo";
my $another-string = $some-string.subst(/foo/, "string"); # gives 'Some string'
$some-string.=subst(/foo/, "string"); # in-place substitution. $some-string is now 'Some string'

say "multi-hyphenate".subst("-"); # OUTPUT: «multihyphenate␤»

Callable

대체는 Callable일 수 있으며, 이때 현재 Match 객체가 $/ 변수와 $_ 주제 변수에 모두 들어가요. Callable을 대체로 쓰는 것은 정규식에서 만든 어떤 캡처든 참조할 수 있는 방법이에요.

# Using capture from $/ variable (the $0 is the first positional capture)
say 'abc123defg'.subst(/(\d+)/, { " before $0 after " });
# OUTPUT: «abc before 123 after defg␤»

# Using capture from $/ variable (the $<foo> is a named capture)
say 'abc123defg'.subst(/$<foo>=\d+/, { " before $<foo> after " });
# OUTPUT: «abc before 123 after defg␤»

# Using WhateverCode to operate on the Match given in $_:
say 'abc123defg'.subst(/(\d+)/, "[ " ~ *.flip ~ " ]");
# OUTPUT: «abc[ 321 ]defg␤»

# Using a Callable to generate substitution without involving current Match:
my $i = 41;
my $str = "The answer is secret.";
say $str.subst(/secret/, {++$i});    # OUTPUT: «The answer is 42.␤»

Adverbs

다음 부사들이 지원돼요.

short long meaning
:g :global 가능한 한 자주 매치하려 함
:nth(Int|Callable|Whatever) n번째 매치만 치환함; 별칭: :st, :nd, :rd, :th
:ss :samespace 치환 시 공백 보존
:ii :samecase 치환 시 대소문자 보존
:mm :samemark 문자 부가 기호 보존 (예: 'ü'를 'o'로 바꾸면 'ö'가 됨)
:x(Int|Range|Whatever) 정확히 $x 개의 매치를 치환함

오직 s/// 형태에서만 :ii:i를, :ss:s를 암시한다는 점을 주의하세요. 메서드 형태에서는 :s:i 수정자를 subst 메서드 호출이 아니라 정규식에 추가해야 해요.

더 많은 예시

다음은 사용 예시들이에요.

my $str = "Hey foo foo foo";

say $str.subst(/foo/, "bar", :g);           # OUTPUT: «Hey bar bar bar␤»
say $str.subst(/\s+/, :g);                  # OUTPUT: «Heyfoofoofoo␤»

say $str.subst(/foo/, "bar", :x(0));        # OUTPUT: «Hey foo foo foo␤»
say $str.subst(/foo/, "bar", :x(1));        # OUTPUT: «Hey bar foo foo␤»
# Can not match 4 times, so no substitutions made
say $str.subst(/foo/, "bar", :x(4));        # OUTPUT: «Hey foo foo foo␤»
say $str.subst(/foo/, "bar", :x(2..4));     # OUTPUT: «Hey bar bar bar␤»
# Replace all of them, identical to :g
say $str.subst(/foo/, "bar", :x(*));        # OUTPUT: «Hey bar bar bar␤»

say $str.subst(/foo/, "bar", :nth(3));      # OUTPUT: «Hey foo foo bar␤»
# Replace last match
say $str.subst(/foo/, "bar", :nth(*));      # OUTPUT: «Hey foo foo bar␤»
# Replace next-to-last last match
say $str.subst(/foo/, "bar", :nth(*-1));    # OUTPUT: «Hey foo bar foo␤»

:nth 부사에는 읽기 좋은 영어 모양의 변형들이 있어요.

say 'ooooo'.subst: 'o', 'x', :1st; # OUTPUT: «xoooo␤»
say 'ooooo'.subst: 'o', 'x', :2nd; # OUTPUT: «oxooo␤»
say 'ooooo'.subst: 'o', 'x', :3rd; # OUTPUT: «ooxoo␤»
say 'ooooo'.subst: 'o', 'x', :4th; # OUTPUT: «oooxo␤»

method subst-mutate

참고: .subst-mutate는 6.d 버전에서 폐기되었고, 앞으로의 버전에서 제거될 거예요. subst.= 메서드 호출 할당 연산자s/// 치환 연산자와 함께 쓰면 돼요.

subst가 수정된 문자열을 반환하고 원본을 그대로 두는 데 반해, subst-mutate를 쓰면 원본 문자열을 변경할 수 있어요. 매치가 성공하면 성공한 매치를 나타내는 Match 객체를 반환하고, 아니면 Nil을 반환해요. Iterable 값을 가진 :nth(또는 그 별칭), :g, :global, :x 인자를 쓰면 Match 객체들의 List를, 매치가 없으면 빈 List를 반환해요.

my $some-string = "Some foo";
my $match = $some-string.subst-mutate(/foo/, "string");
say $some-string;  # OUTPUT: «Some string␤»
say $match;        # OUTPUT: «「foo」␤»
$some-string.subst-mutate(/<[oe]>/, '', :g); # remove every o and e, notice the :g named argument from .subst

Regex $matcher를 쓰면, $/ 특별 변수가 (매치가 없으면) Nil, Match 객체, 또는 (:g 같은 다중 매치 옵션을 쓰면) Match 객체들의 List로 설정돼요.

routine substr

multi        substr(Str:D $s, $from, $chars?  --> Str:D)
multi        substr(Str:D $s, Range  $from-to --> Str:D)
multi method substr(Str:D $s: $from, $chars?  --> Str:D)
multi method substr(Str:D $s: Range $from-to  --> Str:D)

$from-to의 끝점(Int로 변환)이 지정하는 인덱스 사이, 또는 인덱스 $from부터 길이 $chars만큼의 원본 문자열의 부분 문자열을 반환해요.

$from$chars 모두 Callable로 지정할 수 있고, 그 반환 값이 인자 값으로 사용돼요. $from은 원본 문자열의 길이로, $chars$from 이후 남은 문자 수로 호출돼요. $from이나 $charsCallable이 아니면 Int로 강제 변환돼요.

$chars가 생략되거나 사용 가능한 문자보다 크면 $from부터 문자열 끝까지의 부분이 반환돼요. $from-to의 시작 인덱스나 $from이 0보다 작으면 X::OutOfRange 예외가 던져져요. $from-to의 끝 인덱스는 문자열 끝을 넘어서도 허용되며, 그 경우 마지막 문자의 인덱스와 동등해요.

say substr("Long string", 3..6);     # OUTPUT: «g st␤»
say substr("Long string", 6, 3);     # OUTPUT: «tri␤»
say substr("Long string", 6);        # OUTPUT: «tring␤»
say substr("Long string", 6, *-1);   # OUTPUT: «trin␤»
say substr("Long string", *-3, *-1); # OUTPUT: «in␤»

method substr-eq

multi method substr-eq(Str:D:  Str(Cool) $test-string, Int(Cool) $from, :i(:$ignorecase), :m(:$ignoremark) --> Bool)
multi method substr-eq(Cool:D: Str(Cool) $test-string, Int(Cool) $from, :i(:$ignorecase), :m(:$ignoremark) --> Bool)

주어진 시작 인덱스 $from부터 $test-string이 문자열 객체와 정확히 일치하면 True를 반환해요. 예를 들어 "foobar" 문자열에서 부분 문자열 "bar"는 인덱스 3부터 매치돼요.

my $string = "foobar";
say $string.substr-eq("bar", 3);    # OUTPUT: «True␤»

그러나 인덱스 3부터 시작하는 부분 문자열 "barz"는, 처음 세 글자가 일치하더라도 매치되지 않아요.

my $string = "foobar";
say $string.substr-eq("barz", 3);   # OUTPUT: «False␤»

자연스럽게, 전체 문자열을 매치하려면 인덱스 0부터 매치하면 돼요.

my $string = "foobar";
say $string.substr-eq("foobar", 0); # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignorecase(또는 :i)를 주면 호출자와 $test-string의 비교가 대문자·소문자·타이틀케이스 구분을 무시해요.

say "foobar".substr-eq("Bar", 3);              # OUTPUT: «False␤»
say "foobar".substr-eq("Bar", 3, :ignorecase); # OUTPUT: «True␤»

Rakudo 2020.02 릴리스부터 선택 명명 인자 :ignoremark(또는 :m)를 주면 비교가 기본 문자만 고려하고 결합 악센트 같은 부가 기호는 무시해요.

say "cliché".substr-eq("che", 3);              # OUTPUT: «False␤»
say "cliché".substr-eq("che", 3, :ignoremark); # OUTPUT: «True␤»

이 메서드는 Cool 타입에서 상속되므로 정수에도 동작해요. 따라서 정수 42는 인덱스 1부터 값 342를 매치해요.

my $integer = 342;
say $integer.substr-eq(42, 1);      # OUTPUT: «True␤»

예상대로, 인덱스 0부터 시작하면 전체 값을 매치할 수 있어요.

my $integer = 342;
say $integer.substr-eq(342, 0);     # OUTPUT: «True␤»

다른 값을 쓰거나 잘못된 시작 인덱스를 쓰면 매치되지 않아요.

my $integer = 342;
say $integer.substr-eq(42, 3);      # OUTPUT: «False␤»
say $integer.substr-eq(7342, 0);    # OUTPUT: «False␤»

method substr-rw

method substr-rw($from, $length = *)

문자열 변수의 일부에 대한 쓰기 가능한 참조처럼 동작하는 Proxy를 반환하는 substr 버전이에요. 첫 번째 인자 $from은 치환이 일어나야 할 문자열 내 인덱스를, 마지막 인자 $length는 교체할 문자 수를 지정해요. 지정하지 않으면 $length는 문자열의 길이로 기본 설정돼요.

예를 들어 메서드 형태에서 "abc" 문자열을 가져와 두 번째 문자(인덱스 1)를 "z"로 바꾸고 싶다면 이렇게 해요.

my $string = "abc";
$string.substr-rw(1, 1) = "z";
$string.say;                         # OUTPUT: «azc␤»

새 문자를 삽입할 수도 있다는 점에 주의하세요.

my $string = 'azc';
$string.substr-rw(2, 0) = "-Zorro-"; # insert new characters BEFORE the character at index 2
$string.say;                         # OUTPUT: «az-Zorro-c␤»

substr-rw에는 함수 형태도 있어서, 위 예시들은 이렇게도 쓸 수 있어요.

my $string = "abc";
substr-rw($string, 1, 1) = "z";
$string.say;                          # OUTPUT: «azc␤»
substr-rw($string, 2, 0) = "-Zorro-";
$string.say;                          # OUTPUT: «az-Zorro-c␤»

substr-rw가 반환하는 쓰기 가능한 참조에 별명을 붙여 반복 연산에 쓸 수도 있어요.

my $string = "A character in the 'Flintstones' is: barney";
$string ~~ /(barney)/;
my $ref := substr-rw($string, $0.from, $0.to-$0.from);
$string.say;
# OUTPUT: «A character in the 'Flintstones' is: barney␤»
$ref = "fred";
$string.say;
# OUTPUT: «A character in the 'Flintstones' is: fred␤»
$ref = "wilma";
$string.say;
# OUTPUT: «A character in the 'Flintstones' is: wilma␤»

routine samemark

multi  samemark(Str:D $string, Str:D $pattern --> Str:D)
method samemark(Str:D: Str:D $pattern --> Str:D)

각 문자의 부가 기호/악센트 정보가 $pattern의 대응 문자의 부가 기호/악센트와 일치하도록 바뀐 $string복사본을 반환해요. $string$pattern보다 길면, $string의 나머지 문자들은 $pattern의 마지막 문자와 같은 부가 기호/악센트를 받아요. $pattern이 비어 있으면 아무 변경도 없어요.

예시:

say 'åäö'.samemark('aäo');                        # OUTPUT: «aäo␤»
say 'åäö'.samemark('a');                          # OUTPUT: «aao␤»

say samemark('Räku', 'a');                        # OUTPUT: «Raku␤»
say samemark('aöä', '');                          # OUTPUT: «aöä␤»

method succ

method succ(Str:D: --> Str:D)

1만큼 증가된 문자열을 반환해요.

문자열 증가는 "마법" 같아요. 점으로 앞서지 않은 마지막 영숫자 시퀀스를 찾아 그것을 증가시켜요.

'12.34'.succ;      # OUTPUT: «13.34»
'img001.png'.succ; # OUTPUT: «img002.png»

실제 증가 단계는 마지막 영숫자 문자를 그것이 속한 문자 범위에 매핑하고, 그 범위에서 다음 문자를 고르며, 오버플로 시 이전 글자로 올림해요.

'aa'.succ;   # OUTPUT: «ab»
'az'.succ;   # OUTPUT: «ba»
'109'.succ;  # OUTPUT: «110»
'α'.succ;    # OUTPUT: «β»
'a9'.succ;   # OUTPUT: «b0»

문자열 증가는 Unicode를 인식하며, 문자가 한 문자 범위에 고유하게 분류될 수 있는 문자 체계에서 일반적으로 동작해요.

method pred

method pred(Str:D: --> Str:D)

1만큼 감소된 문자열을 반환해요.

문자열 감소는 문자열 증가(succ 참고)와 마찬가지로 "마법" 같아요. 언더플로에서는 실패해요.

'b0'.pred;           # OUTPUT: «a9»
'a0'.pred;           # OUTPUT: Failure
'img002.png'.pred;   # OUTPUT: «img001.png»

routine ord

multi        ord(Str:D  --> Int:D)
multi method ord(Str:D: --> Int:D)

문자열에서 첫 번째 그래핌의 기본 문자들의 코드포인트 번호를 반환해요.

예시:

ord("A"); # 65
"«".ord;  # 171

method ords

multi method ords(Str:D: --> Seq)

문자열을 구성하는 코드포인트를 설명하는 Unicode 코드포인트 번호들의 목록을 반환해요.

예시:

"aå«".ords; # (97 229 171)

문자열은 그래핌으로 표현돼요. 문자열의 한 문자가 여러 코드포인트로 표현된다면, 그 코드포인트들이 모두 ords 결과에 나타나요. 따라서 결과의 요소 수가 항상 chars와 같지는 않지만 codes와는 같아요. codes는 코드포인트를 다른 방식으로 계산해서, 결과가 더 빠를 수도 있어요.

반환되는 코드포인트들은 문자열을 NFC로 나타낸 거예요. 다른 형태가 필요하면 NFD, NFKC, NFKD 메서드를 참고하세요.

method trans

multi method trans(Str:D: Pair:D \what, *%n --> Str)
multi method trans(Str:D: *@changes, :complement(:$c), :squash(:$s), :delete(:$d) --> Str)

하나 이상의 문자를 하나 이상의 문자로 대체해요. 키와 값 모두에서 범위가 지원돼요. Regex도 키로 동작해요. 키와 값의 목록을 쓰면 부분 문자열도 대체할 수 있어요. :complement와 함께 호출하면 매치된 값이나 범위 외의 모든 것이 단일 값으로 대체되고, :delete면 대응하는 대체가 없는 매치된 문자들이 제거돼요. :complement:delete를 결합하면 매치된 값 외의 모든 것을 제거하되, 대체 문자가 지정된 경우에는 :delete가 무시돼요. 부사 :squash는 반복되는 매치된 문자를 단일 문자로 줄여요.

예시:

my $str = 'say $x<b> && $y<a>';
$str.=trans( '<' => '«' );
$str.=trans( '<' => '«', '>' => '»' );

$str.=trans( [ '<'   , '>'   , '&' ] =>
             [ '&lt;', '&gt;', '&amp;' ]);

$str.=trans( ['a'..'y'] => ['A'..'z'] );

"abcdefghij".trans(/<[aeiou]> \w/ => '');                     # OUTPUT: «cdgh»

"a123b123c".trans(['a'..'z'] => 'x', :complement);            # OUTPUT: «axxxbxxxc»
"aaa1123bb123c".trans('a'..'z' => 'A'..'Z', :squash);         # OUTPUT: «A1123B123C»
"aaa1123bb123c".trans('a'..'z' => 'x', :complement, :squash); # OUTPUT: «aaaxbbxc»

일반적으로 치환 후 문자열은 같은 길이를 유지해요.

say "a123b123c".trans('23' => '4');   # OUTPUT: «a144b144c␤»
say "a123b123c".trans('123' => 'þð'); # OUTPUT: «aþðþbþðþc␤»

:squash:delete는 이 경우 같은 효과를 가지며 엄격한 치환을 만들어요.

say "a123b123c".trans('123' => 'þð', :squash); # OUTPUT: «aþðbþðc␤»
say "a123b123c".trans('123' => 'þð', :delete); # OUTPUT: «aþðbþðc␤»

:delete는 원본 문자열에서 매치되지 않은 문자도 제거해요.

say "abc".trans("abc".comb => 1..2, :delete);  # OUTPUT: «12␤»

두 형태의 multi 메서드 동작이 약간 다르다는 점을 주의하세요. 첫 번째 형태는 원본이 한 문자이면 문자 하나만 변환해요.

say "abcd".trans( "a" => "zz" );  # OUTPUT: «zbcd␤»
say "abcd".trans( "ba" => "yz" ); # OUTPUT: «zycd␤»

두 번째 경우는 원본이 한 문자보다 길기 때문에 예상대로 동작해요. 그러나 multi 메서드의 Pair가 원본이나 대상으로 Str을 가지지 않으면 두 번째 multi 메서드로 처리되고 동작이 달라져요.

say "abcd".trans: ["a"] => ["zz"]; # OUTPUT: «zzbcd␤»

이 경우 Pair의 원본과 대상이 모두 Str이 아니에요. Pair 시그니처의 메서드는 두 번째 메서드를 호출해서, 위 호출을 "abcd".trans: ["a"] => ["zz"],(뒤에 쉼표를 붙여 Pair가 아닌 Positional로 만든 것)와 동등하게 만들어 출력에 보이는 동작을 만들어내요.

method indent

multi method indent(Int $steps where { $_ == 0 } )
multi method indent(Int $steps where { $_ > 0  } )
multi method indent($steps where { .isa(Whatever) || .isa(Int) && $_ < 0 } )

문자열의 각 줄을 $steps만큼 들여쓰기해요. $steps가 음수면 대신 내어쓰기(outdent)해요. $steps*이면 문자열을 여백(margin)까지 내어써요.

"  indented by 2 spaces\n    indented even more".indent(*)
    eq "indented by 2 spaces\n  indented even more"

method trim

method trim(Str:D: --> Str)

앞뒤 공백을 제거해요. 문자열의 메서드로도, 함수로도 쓸 수 있어요. 메서드로 쓰면 정리된 문자열을 반환해요. 제자리에서 정리하려면 .=trim으로 써야 해요.

my $line = '   hello world    ';
say '<' ~ $line.trim ~ '>';        # OUTPUT: «<hello world>␤»
say '<' ~ trim($line) ~ '>';       # OUTPUT: «<hello world>␤»
$line.trim;
say '<' ~ $line ~ '>';             # OUTPUT: «<   hello world    >␤»
$line.=trim;
say '<' ~ $line ~ '>';             # OUTPUT: «<hello world>␤»

참고: trim-trailingtrim-leading

method trim-trailing

method trim-trailing(Str:D: --> Str)

문자열 에서 공백 문자를 제거해요. 참고: trim

method trim-leading

method trim-leading(Str:D: --> Str)

문자열 시작에서 공백 문자를 제거해요. 참고: trim

method NFC

method NFC(Str:D: --> NFC:D)

NFC 형식(Unicode Normalization Form C / Composed)의 코드포인트 문자열을 반환해요.

method NFD

method NFD(Str:D: --> NFD:D)

NFD 형식(Unicode Normalization Form D / Decomposed)의 코드포인트 문자열을 반환해요.

method NFKC

method NFKC(Str:D: --> NFKC:D)

NFKC 형식(Unicode Normalization Form KC / Compatibility Composed)의 코드포인트 문자열을 반환해요.

method NFKD

method NFKD(Str:D: --> NFKD:D)

NFKD 형식(Unicode Normalization Form KD / Compatibility Decomposed)의 코드포인트 문자열을 반환해요.

method ACCEPTS

multi method ACCEPTS(Str:D: $other)

문자열이 $other같으면 True를 반환해요.

method Capture

method Capture()

X::Cannot::Capture를 던져요.

routine val

multi val(*@maybevals)
multi val(Slip:D \maybevals)
multi val(List:D \maybevals)
multi val(Pair:D \ww-thing)
multi val(\one-thing)
multi val(Str:D $MAYBEVAL, :$val-or-fail)

숫자 값으로 파싱될 수 있는 Str을 받으면, 적절한 allomorph를 생성하려 시도해요. IntStr, NumStr, RatStr, ComplexStr 중 하나를 반환하거나, 숫자 값을 파싱할 수 없으면 평범한 Str을 반환해요.

say val("42").^name;    # OUTPUT: «IntStr␤»
say val("42e0").^name;  # OUTPUT: «NumStr␤»
say val("42.0").^name;  # OUTPUT: «RatStr␤»
say val("42+0i").^name; # OUTPUT: «ComplexStr␤»

문자열의 일부로 플러스, 마이너스 기호와 Unicode "Minus Sign"을 쓸 수 있어요.

say val("−42");         # OUTPUT: «−42␤»

Unicode 범주 Nl(number letters)과 No(other numbers)에 속하는 문자는 언어에서 숫자 리터럴로 쓸 수 있지만, val로는 의도적으로 숫자로 변환되지 않아요. val을 쓰면 failure가 생겨요. 합성 숫자(예: 7̈)도 마찬가지예요. 그런 문자를 Numeric으로 변환하려면 unival을 참고하세요.

method Version

method Version(Str:D: --> Version:D)

Rakudo 2020.01 릴리스부터 사용 가능해요.

문자열을 Version으로 강제 변환해요.

이는 시그니처의 타입 강제 변환에 쓸 수 있어요. 예를 들어:

sub f(Version(Str) $want-version) { say $want-version.^name };
f "1.2.3";  # OUTPUT: «Version␤»

method Date

method Date(Str:D:)

Rakudo 2020.05 릴리스부터 사용 가능해요.

문자열이 제대로 형식화돼 있다면 StrDate 객체로 강제 변환해요. Date(Str)도 동작해요.

예시:

say '2015-11-24'.Date.year;  # OUTPUT: «2015␤»
say Date('2015-11-24').year; # OUTPUT: «2015␤»

method DateTime

method DateTime(Str:D:)

Rakudo 2020.05 릴리스부터 사용 가능해요.

문자열이 제대로 형식화돼 있다면 StrDateTime 객체로 강제 변환해요. DateTime(Str)도 동작해요.

예시:

say ('2012-02-29T12:34:56Z').DateTime.hour; # OUTPUT: «12␤»
say DateTime('2012-02-29T12:34:56Z').hour;  # OUTPUT: «12␤»

Rakudo 2022.07 릴리스부터는 "YYYY-MM-DD" 문자열만 지정해 그 날짜의 자정을 나타낼 수도 있어요.

say "2023-03-04".DateTime;  # OUTPUT: «2023-03-04T00:00:00Z␤»