2011-11-08 83 views
1

我常帶文件的任意一組在我的桌面,格式爲:是雪豹的工作Perl腳本不再工作在獅子

屏幕在23年8月10日拍攝2011-11-08 AM.png

屏幕在57年8月8日拍攝2011-11-08 AM.png

對它們運行一個Perl腳本,並將其重命名爲

SS-2011-11-08在57年8月8日,在23年8月10日AM.png

SS-2011-11-08 AM.png

這停止工作,沒有發生重命名。現在,我必須要改變它,我想它更改爲:

SS-2011.11.08.at.8.10.23.AM.png

SS-2011.11.08.at.8.08 .57.AM.png

  • 替換 「屏幕截圖」 作爲確切的情況下,始終以 「SS」
  • 更換所有-.
  • 更換所有空格.

我知道它與貪婪有關,但我沒有寫這個,也不管我做了多少擺弄,我似乎無法得到它的工作。在我的生活中,我用了幾個小時的perl。我想我可以在php中做到這一點,但想了解如何將它保存在perl中,因爲它總是能夠調試。我查閱了regs格式規則,他們沒有申請。無論是Mac OS X Lion中的東西,還是雪豹都允許發生的事情不應該發生。

謝謝大家!

這是我到目前爲止有:

#!/usr/bin/perl -w 

chdir("/Users/me/Desktop") or die; 
my @files =(); 
print "after my \@files array\n"; 
print @files; 

while (<*>) { 
    push @files, $_ if m!^Screen Shot (.*) at (.*)\.png!; 
} 


foreach my $f (@files) { 
    my $new = $f; 
    $new =~ s!^SS (.*) at (.*)\.png!ss-$1\_$2.png!; 
    print "$f -> $new\n"; 
    rename ($f, $new) or die; 
} 
+1

使用調試器('perl -d ...')並單步執行代碼來查找問題。 – mob

+0

是否有任何錯誤消息?你能給我們一些樣本輸入嗎?考慮到樣本輸入,實際產出是多少?預期產出是多少? – 2011-11-08 17:08:35

+2

編寫現代Perl,'嚴格使用'! – Quentin

回答

1

只要改變更換這個

$new =~ s/Screen\.Shot\.(.*)\.at\.(.*)/ss-$1.at.$2/; 

和之前添加另一個替換

$new =~ s/[- ]/./g; # Replace all dashes and spaces to dots 
+0

這工作完美。儘管在Lion中,屏幕截圖不再是屏幕截圖,而是屏幕截圖,其中第二個單詞是「S」上的上限。 – user170579

0

當你將所有文件添加到與下面的正則表達式匹配的數組中:

/^Screen Shot (.*) at (.*)\.png/ 

然後嘗試從上述的陣列,它看起來像替換每個文件:

/^SS (.*) at (.*)\.png/ 

你怎麼可能指望這個工作?

0

第一個表達式(在if

m!^Screen Shot \d+-\d+-\d+ at \d+\.\d+\.\d+\s[AP]M\.png$! 

第二個表達式(雖然我認爲在技術上多餘的,因爲這場比賽表現是除了捕獲組相同)將是:

s!^Screen Shot (\d+)-(\d+)-(\d+) at (\d+)\.(\d+)\.(\d+)\s([AP]M)\.png$!ss-$1.$2.$3.at.$4.$5.$6.$7.png! 
至少,

適合我!

如果你想讓我爲你分解它,請問!

0

我正在運行雪豹,我的屏幕截圖保存爲Screen shot ...(注意小寫sshot)。 Lion現在是否使用大寫S?如果是這樣,並且您的原始腳本使用了小寫s,那麼這可能是破壞它。無論哪種方式,我們來修復它。

你的替代

$new =~ s!^SS (.*) at (.*)\.png!ss-$1\_$2.png!; 

正在尋找的文件名開頭SS,後面加一個空格,但它聽起來像是要更改文件名開頭SS後跟一個-Screen [Ss]hot之後空間。

此外,作爲@FailedDev指出的那樣,你while循環只增加匹配^Screen Shot (.*) at (.*)\.png@files陣列的文件,所以你foreach循環永遠不會看到開頭的文件SS

這種替換代碼:

#!/usr/bin/perl -w 
use strict; # ALWAYS! 

chdir("/Users/me/Desktop") or die("Could not chdir() to ~/Desktop: $!"); 
foreach my $f (<*>) { 
    my $new = $f; 
    if ($new =~ s!^(?:SS-|Screen [Ss]hot)([\d-]+) at ([\d\.]+) ([AP]M)\.png!ss-$1.at.$2.$3.png!) { 
     $new =~ s/\-/\./g; 
     print "$f -> $new\n"; 
     rename ($f, $new) or die("Could not rename $f to $new: $!"); 
    } 
} 

爲了幫助您瞭解正在發生的事情:

  • ^s!手段只能看文本的開頭來代替,在這種情況下,文件名
  • SS-Screen [Ss]hot之間的| [按(?:)分組]表示查找eit她的SS-Screen [Ss]hot
  • 三個捕捉組[由()包圍而不?:]不包含空格,所以$1$2,並在換貨不會包含空格$3
  • if語句確保if塊內的代碼僅在文件名匹配且實際發生替換時纔會執行。