perlで配列の差分抽出

Perlでディレクトリ構成とファイルの差分をチェックするスクリプトを作っていてネットで見つけたけど、ハッシュの使い方がとても参考になった。
以下参考にして書いたコードの一部抜粋。
表面ばかり勉強していて、もっと根本的なとこを勉強しなきゃって思う。

use Text::Diff 'diff';

# list_filesは引数に与えたディレクトリ配下のファイルを配列で返すサブルーチン
my @old = list_files($dir1);
my @new = list_files($dir2);

my @difference = ();
my %diffmap = ();
my %count = ();

foreach my $element (@new) {
    # 新しいファイルのパスをkeyとして値を-1にする
    $count{$element}--;
}

foreach my $element (@old) {
    my $tmp = $element;
    $element =~ s/\/prev//; # 古いパスから新しいパスに置換する 
    $diffmap{$element} = $tmp; # ハッシュ[新しいパス] = 古いパス
    $count{$element}++; # 新旧両方に存在するファイルは値が0、旧ファイルしかないものは値が1になる
}

foreach my $element (keys(%count)) {
    if ($count{$element} == 1) {
        # 削除されたファイル
        push(@difference, "- $element");
    } elsif ($count{$element} == -1) {
        # 追加されたファイル
        push(@difference, "+ $element");
    } else {
        # 差分があるファイルのみ@differenceに入れる
        my $tmp = diff($diffmap{$element}, $element);
        if (length($tmp) > 0) {
            push(@difference, "! $element");
        }
    }
}

foreach my $file (sort(@difference)) {
    print "$file\n";
}