我试图写一个程序,找出用perl在多个驱动器重复的文件名。 这是我的剧本,但它给出错误信息。
#!/usr/bin/perl
use File::Find;
@filename;
@path;
$count;
open my $out, '>', 'output.txt' or die $!;
my $file = "E:";
find( \&edit, "$file" );
sub edit() {
$count++;
push( @filename, $_ );
push( @path, $File::Find::name );
}
print "Processing.";
for ( my $i = 0 ; $i < $count ; $i++ ) {
for ( my $j = $i + 1 ; $j < $count ; $j++ ) {
if ( $filename[$i] =~ /\Q$filename[$j]\E/ ) {
print $out("$filename[$i] = $filename[$j]\n");
print ".";
}
}
}
你应该总是将use strict;
和use warnings;
在每个Perl脚本。 但是,你运气并没有导致任何错误。
事实上,除了使用正则表达式来测试时,你应该已经使用eq
,你的脚本看起来功能。 作为一个风格上的变化,虽然,我会一直保存在阵列中的散列所有路径更容易地找到匹配的文件。 特别是作为目前你的方法不会列出的3个或以上的团体在一起。
use strict;
use warnings;
use autodie;
use File::Find;
my %files;
open my $out, '>', 'output.txt';
my $file = "E:";
find( \&edit, "$file" );
sub edit() {
push @{$files{$_}}, $File::Find::name;
}
while (my ($file, $paths) = each %files) {
next if @$paths == 1;
print "$file @$paths\n";
}
本Kathir,模块文件::查找::规则是非常强大的,易于使用。 只找到MP3文件这样做:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find::Rule;
my $directory_to_look_in = '/tmp/you/know';
my @files = File::Find::Rule->file()->name('*.mp3')->in($directory_to_look_in);