2012-04-19 2 views
2

디렉토리에있는 dir 또는 파일의 이름을 가져 와서 최소한의 양으로 배열에 넣으려고합니다. 가능한 한 코드. <path/to/dir/*>Perl one-liner : 기본 이름과 같은 경로에서 성을 얻기 위해 배열에서 스트립 경로

정규식 대체 : s/.+\///

내가 생각하는 방법을 내 절름발이 시도가 작동 것이다 :

my @flist = <path/to/dir/*> 
s/.+\/// for @flist; 

나는

펄 글로브 모든 조각을 가지고 있지만 함께 넣어 수 없습니다 그러나 나는 그렇지 않다고 생각한다.

펄 마스터의 도움이 거의 필요하지 않습니까?

Gracias!

편집 : 위의 코드는 세미콜론이 필요하다고 생각합니다. N00b 실수. 죄송합니다! 아직 기술적으로 두 줄에 있지만.

+0

생각 너는 원치 않는 것을 얻는다? – TLP

+1

_ 나는 스스로에게 도전하려고 노력하고 있습니다 ... _ 다른 사람들에게 그것을 요구함으로써? :> – byrondrossos

+0

@TLP 구문 오류가 발생합니다. – dlite922

답변

2

을 내가 필요한 모든는 어떤 기능을 수행

my @flist = map m|([^/]+)$|, <path/to/dir/*>; 
+0

내가 찾고있는 정확한 답변으로 인해 최선의 답변이 변경되었습니다. 감사! – dlite922

2

코드가 제대로 작동하지 않는 것 같습니다. File::Basename (코어 모듈)과 같이 경로를 제거하는 모듈을 사용할 수도 있습니다. 더 간단한 방법은 경로가 전혀 포함되지 않도록하는 것입니다.

단순히 dir로 이동하고 거기에 glob을 사용할 수 있습니다. 이후에 작업 디렉토리가 변경된다는 것을 기억하십시오.

chdir "/path/to/dir"; 
my @flist = <*>; 

또한 opendirreaddir를 사용할 수 있습니다. 숨겨진 파일을 포함하여 glob 이상의 파일이 반환됩니다.

opendir my $dh, "/path/to/dir" or die $!; 
my @flist = readdir $dh; 
5
@flist = map basename($_), @flist; 

또는

$_ = basename($_) for @flist; 

줄 수 당신에게 중요하기 때문에

, 다음은 당신이 요구하는 선 당신이 이미 가지고있는 라인의 깔끔한 조합은 다음과 같습니다

my @flist = map basename($_), <path/to/dir/*>; 
+0

"파일 사용 :: 기본 이름"을 포함하면 기술적으로 2 줄이지만 가장 깨끗한 한 줄짜리이기 때문에 대답을 선택했습니다 – dlite922

+1

두 줄이면 왜 신경 쓰나요? ? –

+0

@ dlite922 대신 한 줄짜리 값이 있다고 생각되면 같은 줄에'use File :: Basename;'(그리고'use strict;'와'use warnings')을 넣을 수 있습니다. – ikegami

1

숨겨진 파일을 모두 포함하려면 도트와 도트 도트) 당신이 할 수 있습니다 : 당신이 관심있는 diretory로 변경 한 이후

chdir /mypath or die "$!\n"; 
my @list = glob(".* *"); 

glob

을보기 만 파일 이름은 경로없이보고됩니다. 점과 점 점 파일을보고 건너 뛰려면하지만, 다른 숨겨진 (점) 사람을보고, 당신이 할 수 있습니다

for (@list) { 
    next if m{^\.\.?$}; 
    print "$_\n"; 
} 
+1

이렇게하면 단지 _뿐만 아니라 _end_에 점이있는 파일은 건너 뜁니다. 그리고 .. –

+0

@briandfoy - 죄송합니다. 감사와 함께 고정. – JRFerguson

0
my @flist=glob('/usr/include/*.h'); 
s/.*\///g for @flist; 
print join ("\n",@flist); 
관련 문제