2012-08-01 51 views
1

在我開始之前,我想讓你知道我不是Perl專家。我剛開始是因爲分配給我的一些特定任務。在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

我相信這段代碼是Perl,而不是PHP。 – Palladium 2012-08-01 16:21:43

+0

我的不好,適當地改變了它.. – Nani 2012-08-01 16:39:19

+0

你的問題不清楚。你需要什麼不同於's \\。dat \ .gz $ /。trg /'? – Borodin 2012-08-01 17:18:30

回答

2

所以,你要改變一個文件名的「延伸」,包括可選.gz?嘗試:

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

抱歉的延遲,這對我來說最好.... – Nani 2012-08-14 17:17:17

1

嘗試

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

沒有必要做所有這些花哨的東西分裂,試圖捕捉到內線:

故障:

。火柴 。 。*相匹配的一切(除換行符) $字符串的結尾

那麼你只是更換與.trg

所以你基本上只是第一後採取一切相匹配「」與.trg更換

希望幫助:)

+1

以及如果文件名包含'.'(這在* nix環境中是完全有效的)? – pavel 2012-08-01 16:53:55

+1

然後s /\..*?$/。trg /否則沒有辦法告訴 – 2012-08-01 17:19:42