2011-09-09 81 views
1

我想使用文件從音樂結構的目錄中提取值::查找::規則,我有困難得到每張專輯如果存在,例如,如果一張專輯的總盤包含3個子目錄DISC1,DISC2,DISC3 - 總盤值應該是3,如果我之前用grep這些目錄的「for」語句它得到的總所有的發現,如果我嘗試內的「for」語句它計算在一個一次。如何提取每張專輯的總盤數。謝謝。如何計算目錄和取得的最大數值

use autodie; 
use strict; 
use warnings; 
use File::Find::Rule; 
use File::Spec; 

my $dir = 'D:\Test'; 
$dir =~ s#\\#/#g; 

my @fd = File::Find::Rule->directory() 
->name(qr/\(\d+\)/) 
->in($dir); 

my $grep_totaldiscs = grep /DISC\d+/, @fd; 
print "$grep_totaldiscs\n"; 

for my $fd (@fd) { 

    my ($genre, $artist, $album, $disc) = (File::Spec->splitdir($fd))[2..5]; 

    my ($discnumber, $totaldiscs); 
    if ($fd =~ /DISC(\d+)/) { 
     $discnumber = $1; 
      $totaldiscs = $1 if (defined($totaldiscs) < $1); 
     print "$album $totaldiscs\n"; 
    } 

} 

回答

0

在大綱:

  • 循環之前:聲明一個哈希容納的最大 - 即總盤數 - 對每個相冊。
  • 在循環中:更新專輯的散列項,如果它是一個新的最大。
  • 循環後:遍歷散列處理或顯示。

我已經使用藝術家和專輯合併,以消除散列的關鍵字在這裏。

例如:

my %album_discs; 
for my $fd (@fd) { 

    my ($genre, $artist, $album, $disc) = (File::Spec->splitdir($fd))[2..5]; 
    my $aakey = "${artist}~${album}"; 

    my ($discnumber, $totaldiscs); 
    if ($fd =~ /DISC(\d+)/) { 
     $discnumber = $1; 
     $album_discs{$aakey} = $discnumber 
      if (! exists $album_discs{$aakey} || $album_discs{$aakey} < $discnumber); 
    } 
} 

for my $aakey (keys %album_discs) { 
    my ($artist, $album) = split(/~/, $aakey); 
    print "Number of discs for album $album by $artist is $album_discs{$aakey}\n"; 
} 
+0

馬丁,非常感謝您的幫助。我測試了你的建議,它打印了包含光盤編號但是值爲1的所有找到的目錄。我不擅長使用散列鍵查看是否應該更正任何內容,但我會繼續測試。 – thebourneid

+0

我認爲我有錯誤的方法 - 這可能是問題的一部分。現在糾正了。 –

+0

現在很完美。非常感謝。 – thebourneid