私はいくつかの長いファイルのリストを前処理するためのスクリプトを書き込もうとしていましたが、Perlにまだ自信がなく(能力もありません)、希望する結果が得られていません。
以下のスクリプトは非常に進行中ですが、重複のチェックに固執しているので、どこが間違っているのか誰かに知らせていただければ幸いです。重複を処理するブロックは、私が見つけた例と同じ形式のようですが、機能していないようです。
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, '<', $ARGV[0] or die "can't open: $!";
foreach my $line (<$fh>) {
# Trim list to remove directories which do not need to be checked
next if $line =~ m/Inventory/;
# MORE TO DO
next if $line =~ m/Scanned photos/;
$line =~ s/\n//; # just for a tidy list when testing
my @split = split(/\/([^\/]+)$/, $line); # separate filename from rest of path
foreach (@split) {
push (my @filenames, "$_");
# print "@filenames\n"; # check content of array
my %dupes;
foreach my $item (@filenames) {
next unless $dupes{$item}++;
print "$item\n";
}
}
}
重複のチェックで何が問題なのかを理解するのに苦労しています。配列に重複が含まれていることはわかっています(最初の印刷関数のコメントを外すと、重複の多いリストが表示されます)。現状のコードは何も生成しません。
私の投稿の主な目的ではありませんが、私の最終的な目的は、リストから一意のファイル名を削除し、他のディレクトリに重複しているファイル名を保持することです。これらのファイルはどれも同一ではありませんが、多くは同じファイルの異なるバージョンであるため、ファイル名に焦点を当てています。
たとえば、次の入力が必要です。
〜/ Pictures / 2010 / 12345678.jpg〜/ Pictures / 2010 / 12341234.jpg〜/ Desktop / temp / 12345678.jpg
次の出力を提供します。
〜/ Pictures / 2010 / 12345678.jpg〜/ Desktop / temp / 12345678.jpg
したがって、可能であれば、分割せずに正規表現に基づいて一致の一意性をチェックするのが理想的だと思います。