我一直在尝试编写一个脚本来预处理一些长长的文件列表,但我对 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
所以我想理想情况下,如果可能的话,最好根据正则表达式检查匹配的唯一性而不进行拆分。