我编写了一个程序来比较两个文件夹的图像文件(每个文件夹有 1000 个文件)与一些逻辑(请参阅此 SO 问题)。
执行它时成功比较直到 900 张图像,但随后它会给出Use of uninitialized value within @tfiles2 in concatenation (.) or string at C:dropboxImage_Compareimage_magick.pl line 55
之类的错误。然后我收到一个弹出错误,例如 Perl Command Line Interpreter has stopped working
,所以我关闭了程序。
我的代码如下:
#!/usr/bin/perl
use Image::Magick;
no warnings 'uninitialized';
use warnings;
use diagnostics;
#use strict;
use List::Util qw(first);
my $directory1="C:/dropbox/Image_Compare/folder1";
opendir(DIR, $directory1) or die "couldn't open $directory1: $!n";
my @files1 = grep { (!/^./) && -f "$directory1/$_" } readdir(DIR);
closedir DIR;
print @files1;
print 'end of files1';
my $directory2="C:/dropbox/Image_Compare/folder2";
opendir(DIR, $directory2) or die "couldn't open $directory2: $!n";
my @files2= grep { (!/^./) && -f "$directory2/$_" } readdir(DIR);
closedir DIR;
print @files2;
print 'end of files2';
print $files1[0];
foreach my $fils2 (@files2)
{
$g1 = Image::Magick->new;
$g2 = Image::Magick->new;
$temp1 = $g1->Read( filename=>"C:/dropbox/Image_Compare/folder1/".$files1[0]."");
$temp1 = $g2->Read( filename=>"C:/dropbox/Image_Compare/folder2/".$fils2."");
$g3 = $g1->Compare( image=>$g2, metric=>'AE' ); # compare
$error1 = $g3->Get( 'error' );
#print $error1;
if ($error1 == '0')
{
print "Matching image is:";
print $fils2 . "n";
my $tdirectory2="C:/dropbox/Image_Compare/folder2";
opendir(DIR, $tdirectory2) or die "couldn't open $directory2: $!n";
my @tfiles2 = grep { (!/^./) && -f "$tdirectory2/$_" } readdir(DIR);
closedir DIR;
#my $index = firstidx { $_ eq'"' .$fils2.'"' } @tfiles2;
my $index = first { $tfiles2[$_] eq $fils2} 0..$#tfiles2;
#print $fils2;
print $index;
my $i=0;
foreach my $fils1 (@files1)
{
print 'ganesh';
print $files1[$i];
print $tfiles2[$index];
print 'gowtham'; print "<br />";
#print @tfiles2;
$g4 = Image::Magick->new;
$g5 = Image::Magick->new;
$temp2 = $g4->Read( filename=>"C:/dropbox/Image_Compare/folder1/".$files1[$i]."");
$temp2 = $g5->Read( filename=>"C:/dropbox/Image_Compare/folder2/".$tfiles2[$index]."");
$g6 = $g4->Compare( image=>$g5, metric=>'AE' ); # compare
$error2 = $g6->Get( 'error' );
$i++;
$index++;
if ($error2 == '0') {}
else {print "Image not matching:"; print $tfiles2[$index]; last;}
#if ($i == '800') {last;}
}
last
}
}
谁能帮忙,我在哪里做错了。
文件夹 1 文件名:0025.bmp 到 1051.bmp;
文件夹 2 文件名:0000.bmp 到 1008.bmp;
谢谢加内什
哪一行是冒犯的,但其中一个可能是候选者:
$temp2 = $g5->Read( filename=>"C:/dropbox/Image_Compare/folder2/".$tfiles2[$index]."");
或
else {print "Image not matching:"; print $tfiles2[$index]; last;}
请注意,无论它是否在数组边界内,您都会$index
递增。您不检查条件 $index > $#tfiles
,这应该会中断循环。
您可能希望通过打印长度来断言两个输入数组都包含>> 900 个元素,例如 print "length: ", scalar @array, "n";
。
您可以通过测试数组中元素的定义性来测试undefined
错误实际发生在哪个索引:
if (not defined $tfiles[$index] or not defined $files1[$i]) {
die "There was an undefined element at index=$index, i=$i";
}
但话又说回来,$i
和 $index
之间的偏移量是恒定的(如我的回答中所述),因此您不必实际携带两个变量。
一个简单的比较器子例程可以使代码更具可读性,从而有助于调试(请参阅过程编程)。
# return true if matching, false otherwise.
sub compare_images {
my ($file1, $file2) = @_;
my $image1 = Image::Magick->new;
$image1->Read(filename => $file1);
my $image2 = Image::Magick->new;
$image2->Read(filename => $file2);
my $result = $image1->Compare(image => $image2, metric => 'AE')->Get('error');
# free memory
undef $image1;
undef $image2;
return 0 == $result;
}
称为喜欢
my $image_root = "C:/dropbox/Image_Compare";
my ($folder1, $folder2) = qw(folder1 folder2);
unless (compare_images("$image_root/$folder1/$files1[$i]",
"$image_root/$folder2/$tfiles[$index]")) {
print "Images not matching at index=$index, i=$in";
print "filename: $tfiles[$index]n";
last;
}
您可以像阅读目录一样
sub get_images_from_dir {
my ($dirname) = @_;
-d $dirname or die qq(The path "$dirname" doesn't point to a directory!);
opendir my $dir => $dirname or die qq(Can't open "$dirname": $!);
my @files = grep {!/^./ and -f "$dirname/$_"} readdir $dir;
closedir $dir;
unless (@files) { die qq(There were no interesting files in "$dirname".) }
return @files;
}
此类步骤使代码更具可读性,并易于插入检查。