2011-09-09 9 views
1

File :: Find :: Ruleを使用して音楽構造ディレクトリから値を抽出したいのですが、もし存在すれば各アルバムの合計ディスクを取得するのが難しいです。 DISC1、DISC2、DISC3の3つのサブディレクトリがあります。ディスクの総数は3です。 "For"ステートメントの前にこれらのディレクトリをgrepすると、見つかったものの合計が得られます。 "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

関連する問題