2012-08-01 5 views
1

시작하기 전에 필자는 펄 전문가가 아님을 알려드립니다. 나는 나에게 할당 된 특정 작업 때문에 그냥 시작했다.Perl에서 파일 확장명 추출 및 대체

이 작업의 요구 사항은 파일의 확장명 (.dat)을 추출하고 .trg으로 바꾸는 것입니다. 문제는 .dat 파일을 압축하여 $filename.dat.gz으로 만들고 확장자를 추출하고 바꿀 때 $filename.dat.trg을 얻는 동안 이상적으로 원하는 것은 $filename.trg입니다.

코드 (이 코드는 매우 오래된 '레거시 코드'인 것처럼 보이며 다른 사람이 관리하고있는 것처럼 너무 많이 수정하고 싶지는 않습니다.)이 코드는 이

#prepare the trigger file 
#get the extension 
my @contains_extension = split (/\./ , $filename); 
my $ext = $contains_extension[-1]; 

#replace with a ".trg" extension 
my $remote_trgfile = $filename; 
$remote_trgfile =~ s/$ext$/trg/; 
my $trgfile = $out; 
$trgfile =~ s/$ext$/trg/; 

.dat.gz 즉, 접미사입니다 위의 코드에서 $filename 기억 내려 놓고되고, 파일 이름은 누군가가 확장 모두를 추출 할 수있는 쉬운 방법 좀 도와 수 있다면 나는 (감사하겠습니다 $filename.dat.gz

입니다 .dat.gz)로 바꾸고 .trg

+0

나는이 코드가 PHP가 아니라 Perl이라고 생각합니다. – Palladium

+0

내 잘못, 적절하게 변경 .. – Nani

+0

질문이 명확하지 않습니다. 's/\. dat \ .gz $ /. trg /'와는 다른 무엇이 필요합니까? – Borodin

답변

2

그래서 당신이 선택 .gz를 포함한 파일 이름의 '확장'을 변경하려면

희망을 교체? 시도해보십시오 :

$filename =~ s{\.[^.]*(?:\.gz)?$}{.trg} 
+0

을 말할 수있는 방법이 없습니다. – Nani

1

$filename =~ s/\..*$/.trg/; 

시도하고 확장 : 캡처 그 화려한 분할 물건을 모두 수행 할 필요를 시도하지

고장 :

. 일치합니다. . *는 (줄 바꿈 제외) 모든 $가

다음 방금 .TRG와

은 그래서 당신은 기본적으로 그냥 처음 이후 모든 것을 가지고 있다는 것을 대체하고있는 문자열의 끝과 일치 일치 "." 및 .TRG에 도움이 :)

+1

그리고 파일 이름에'.' (* nix 환경에서 완벽하게 유효합니다)가 포함되어 있다면? – pavel

+1

그 다음에 s /....??$/. trg/그렇지 않으면 지연을 유감스럽게 생각하는 –