join
join (리스트를 하나의 문자열로)
여러 값을 하나로 모아 문자열을 만들 때, 요소 사이에 구분자를 넣고 싶은 경우가 많아요. 쉼표로 이어 붙이든, 파이프로 이어 붙이든 말이죠. 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»