join

join (리스트를 하나의 문자열로)

여러 값을 하나로 모아 문자열을 만들 때, 요소 사이에 구분자를 넣고 싶은 경우가 많아요. 쉼표로 이어 붙이든, 파이프로 이어 붙이든 말이죠. join은 그 일을 하는 루틴이에요.

출처: Raku Documentation — join

본문

List에서

sub    join($separator, *@list)
method join(List:D: $separator = "")

리스트의 각 요소를 .Str로 호출해 문자열로 취급하고, 그 사이에 $separator를 끼워 넣은 뒤 전체를 하나의 문자열로 이어 붙여요.

say join ', ', <a b c>;             # OUTPUT: «a, b, c␤»

메서드 형태는 구분자를 생략할 수도 있어요.

say <a b c>.join;               # OUTPUT: «abc␤»

메서드 형태는 하위 리스트를 평탄화하지 않는다는 점에 주의하세요.

say (1, <a b c>).join('|');     # OUTPUT: «1|a b c␤»

서브루틴 형태는 슬러피하게 동작해서, 첫 인자 이후의 모든 인자를 하나의 리스트로 평탄화해요.

say join '|', 1, <a b c>;       # OUTPUT: «1|a|b|c␤»

이 경우에는 리스트 <a b c>슬러프되어 평탄화돼요. join을 메서드로 호출할 때와는 다르죠.

리스트의 요소 중 하나가 Junction이라면, join도 최대한 이어 붙여진 Junction을 돌려줘요.

say ("a"|"b","c","d").join;     # OUTPUT: «any(acd,bcd)␤»

Any에서

method join($separator = '') is nodal

객체를 self.list를 호출해 리스트로 변환한 뒤, 그 리스트에 .join을 호출해요. 구분자를 받을 수 있는데 기본값은 빈 문자열이에요.

(1..3).join.say;       # OUTPUT: «123␤»
<a b c>.join("❧").put; # OUTPUT: «a❧b❧c␤»

Thread에서

method join(Thread:D:)

스레드가 끝날 때까지 기다려요.

IO::Spec::Win32에서

method join (Str:D $volume, Str:D $dir, Str:D $file --> Str:D)

catpath와 비슷하게 두 경로 조각을 받아 이어 붙이고, 필요하면 경로 구분자를 추가하거나 제거해요. 다만 $dir$file이 둘 다 문자열 '/'이거나 $dir이 문자열 '.'이면 $file만 돌려줘요. 첫 번째 인자는 무시돼요(볼륨이 있는 시스템에서 다른 IO::Spec 타입과 인터페이스를 일관되게 유지하기 위해 존재해요).

IO::Spec::Win32.join('C:', '/some/dir', 'foo.txt').say;
# OUTPUT: «C:/some/dir\and/more␤»

IO::Spec::Win32.join('C:', '.', 'foo.txt').say;
# OUTPUT: «C:foo.txt␤»

IO::Spec::Win32.join('C:', 「\」, '/').say;
# OUTPUT: «C:\␤»

IO::Spec::Win32.join('//server/share', 「\」, '/').say;
# OUTPUT: «//server/share␤»

IO::Spec::Win32.join('E:', '', 'foo.txt').say;
# OUTPUT: «E:foo.txt␤»

IO::Spec::Cygwin에서

method join(|c)

IO::Spec::Win32.join과 같지만, 최종 결과에서 역슬래시를 슬래시로 바꿔요.

IO::Spec::Unix에서

method join ($, Str:D $dir, Str:D $file --> Str:D)

catpath와 비슷하게 두 경로 조각을 받아 이어 붙이고, 필요하면 경로 구분자를 추가하거나 제거해요. 다만 $dir$file이 둘 다 문자열 '/'이거나 $dir이 문자열 '.'이면 $file만 돌려줘요. 첫 번째 인자는 무시돼요(볼륨이 있는 시스템에서 다른 IO::Spec 타입과 인터페이스를 일관되게 유지하기 위해 존재해요).

IO::Spec::Unix.join($, 'foo', 'bar').say; # OUTPUT: «foo/bar␤»
IO::Spec::Unix.join($, '/', '/').say;     # OUTPUT: «/␤»
IO::Spec::Unix.join($, '.', 'foo').say;   # OUTPUT: «foo␤»
say $*SPEC.join(True,".","/foo");         # OUTPUT: «/foo␤»