Raku의 basename — 경로에서 파일 이름만 떼어내기

Raku의 basename — 경로에서 파일 이름만 떼어내기

경로 문자열에서 마지막에 해당하는 파일시스템 객체 이름, 즉 basename만 꺼내고 싶을 때가 많아요. basename 메서드는 IO::Path 객체와 여러 IO::Spec 구현에서 각자 조금씩 다른 방식으로 이 일을 해요. 공통된 핵심은 '경로의 마지막 이름 부분'을 돌려준다는 거예요.

출처: Raku 공식 문서 — basename

본문

In IO::Path

method basename(IO::Path:D:)

경로 객체에서 basename 부분을 돌려줘요. 이는 경로가 참조하는 파일시스템 객체 자체의 이름이에요.

"docs/README.pod".IO.basename.say; # OUTPUT: «README.pod␤»
"/tmp/".IO.basename.say; # OUTPUT: «tmp␤»

여기서 한 가지 기억할 게 있어요. IO::Spec::Win32 의미론에서 Windows 공유(share)의 basename은 공유 이름이 아니라 \예요.

IO::Path::Win32.new('//server/share').basename.say; # OUTPUT: «\␤»

In IO::Spec::Win32

method basename(Str:D $path --> Str:D)

경로를 문자열로 받아, 마지막 슬래시나 백슬래시 뒤의 (비어 있을 수도 있는) 부분을 돌려줘요.

IO::Spec::Win32.basename("foo/bar/") .raku.say; # OUTPUT: «""␤»
IO::Spec::Win32.basename("foo/bar\\").raku.say; # OUTPUT: «""␤»
IO::Spec::Win32.basename("foo/bar/.").raku.say; # OUTPUT: «"."␤»
IO::Spec::Win32.basename("foo/bar") .raku.say; # OUTPUT: «"bar"␤»

In IO::Spec::Unix

method basename(Str:D $path --> Str:D)

경로를 문자열로 받아, 마지막 슬래시 뒤의 (비어 있을 수도 있는) 부분을 돌려줘요. Win32와 달리 백슬래시를 슬래시처럼 취급하지 않아요.

IO::Spec::Unix.basename("foo/bar/") .raku.say; # OUTPUT: «""␤»
IO::Spec::Unix.basename("foo/bar/.").raku.say; # OUTPUT: «"."␤»
IO::Spec::Unix.basename("foo/bar") .raku.say; # OUTPUT: «"bar"␤»