Как посчитать каталоги и получить наибольшее числовое значение - PullRequest
1 голос
/ 09 сентября 2011

Я хочу извлечь значения из каталогов структуры музыки, используя File :: Find :: Rule, и у меня возникают трудности с получением общего количества дисков каждого альбома, если оно есть, например, если альбом содержит 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";
    }

}

1 Ответ

0 голосов
/ 09 сентября 2011

В общих чертах:

  • Перед циклом: объявите хеш-код для хранения максимума, то есть общего количества дисков, для каждого альбома.
  • Внутри цикла: обновите запись хеша для альбома, если это новый максимум для этого.
  • После цикла: перебрать хеш для обработки или отображения.

Я использовал исполнителя и альбом вместе, чтобы устранить неоднозначность в ключах хеша здесь.

Например:

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...