2010-08-18 4 views
14
$a = '/etc/init/tree/errrocodr/a.txt' 

나는 $file$dira.txt/etc/init/tree/errrocodr/을 추출 할. 어떻게해야합니까?어떻게 전체 경로를 디렉토리와 파일 이름으로 분리 할 수 ​​있습니까?

(편집자 주 :. 원래의 질문은 당신이에 대한 정규 표현식이 필요하다고 추정) 그냥 Basename를 사용

+0

이 질문은 http://stackoverflow.com/questions/3511214/how-to-support-the-searching-file-based-on-regular-expression에서 이미 질문하지 않았습니까? 새 질문을 게시하는 대신 원래 질문을 명확하게 편집해야합니다. – Ether

+0

@Ether, 그건 완전히 다른 질문입니다. 와일드 카드를 기반으로 파일 목록을 얻는 방법을 묻습니다. 이 방법은 하나의 파일 스펙을 여러 부분으로 분할하는 방법에 더 가깝습니다. – paxdiablo

답변

24

을 :

use File::Basename; 
$fullspec = "/etc/init/tree/errrocodr/a.txt"; 

my($file, $dir, $ext) = fileparse($fullspec); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n\n"; 

my($file, $dir, $ext) = fileparse($fullspec, qr/\.[^.]*/); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n"; 

당신이 당신이 요청한 결과를 반환 볼 수 있지만 그건 또한 확장 기능을 캡처 할 수 있습니다 (위의 후반 섹션에서) :

Directory: /etc/init/tree/errrocodr/ 
File:  a.txt 
Suffix: 

Directory: /etc/init/tree/errrocodr/ 
File:  a 
Suffix: .txt 
+2

또는 File :: Spec-> splitpath()를 살펴보십시오. 볼륨을 분리합니다 (그런 일을하는 플랫폼에있을 경우). 두 패키지 중 하나의 장점은 표준 및 휴대용입니다. –

16

당신이 이것에 대한 정규식이 필요하지 않습니다, 당신은) (이 dirname를 사용할 수 있습니다

use File::Basename; 
my $dir = dirname($a) 

그러나이 정규식 작동합니다 :

my $dir = $a 
$dir =~ s/(.*)\/.*$/$1/ 
+0

+1하지만 IMHO는 실수로 OP가 수행 한 경우에도 귀하의 예제에서 '$ a' 변수를 사용하지 않아야합니다. 'sort'에 사용됩니다. – dawg

0

예 :

$a =~ m#^(.*?)([^/]*)$#; 
    ($dir,$file) = ($1,$2); 

그러나 다른 sa 이드를 위해서 단지 Basename을 사용하는 것이 낫습니다.

그리고 sort 함수의 경우 특별한 의미가 있으므로 변수 이름으로 $a$b을 사용하는 것이 좋습니다.

1

정규식 솔루션은 완벽하게 합법적 인 필요라고 생각합니다. 정확히 여기에 대한 인터넷 검색 결과가 여기에 있습니다. 더 큰 일치 표현식의 일부인 그룹에서 파일 이름을 꺼내려고합니다. 내 시도는 다음과 같습니다.

~> echo "https://stackoverflow.com/a/b/c/d" | perl -ne '/(?<dir>\/(\w+\/)*)(?<file>\w+)/ && print "dir $+{dir} file $+{file}\n";' 
dir /a/b/c/ file d 
0

시도해보십시오. 그것은 파일 이름에 대해서는 최소한 작동하지만 수정하면 방향도 제공됩니다 : | 또는/|와 함께 둘 다 사용하는 경우 \ 대신 UNIX 시스템에서 수정할 수 있습니다.

$ filename = ~ s /(^.*/)// g; 어떻게 든 백 슬래시 2 전/표시되지 않습니다

...

1

사용 @array = split("/", $a); 다음 $array[-1]은 파일 이름입니다.

관련 문제