无法访问Perl循环中的哈希查找表

我正在写一个比较两个Excel文件的数据的Perl脚本。

我目前正在采取一个Excel文件的两列,并存储在一个哈希。 我使用的数据是电子邮件地址,这个值只是Excel表格中的另一个值(不重要)。 我只是试图将所有的电子邮件存储为散列键,以便我可以遍历另一个('删除')excel文件,并查看电子邮件是否存在于原始成员表中。

我的意图是这样的:

1)创build哈希和查找数组:

my %members_list; foreach my $row (2..$MembersLastRow){ $members_list{lc($Members->Cells($row,1)->{'Value'})} = lc($Members->Cells($row,2)->{'Value'}); } my @removals_list; foreach my $row (2..$RemovalsLastRow) { push(@removals_list, lc($Removals->Cells($row,1)->{'Value'})); } 

2)遍历查找数组并检查哈希中是否存在:

 foreach my $key (sort @removals_list) { print $key; if($members_list{$key}){ print " - MATCH!"; } print "\n"; } 

问题是,当我尝试运行这个,从来没有任何匹配。 删除列表中的所有元素都应该存储在members_list哈希中。 我已经尝试打印$ members_list {$ key}到屏幕上,然后出现“未初始化的使用”等等等等等等。

这几天我一直在为此奋斗,任何帮助都不胜感激。

这是我使用的代码的整个页面!

 use strict; use 5.010; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; $Win32::OLE::Warn = 3; # die on errors... # get already active Excel application or open new my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); $Excel->{DisplayAlerts}=0; # open Excel file my $Book = $Excel->Workbooks->Open("**FILENAME1**"); my $Book2 = $Excel->Workbooks->Open("**FILENAME2**"); # You can dynamically obtain the number of worksheets, rows, and columns # through the Excel OLE interface. Excel's Visual Basic Editor has more # information on the Excel OLE interface. Here we just use the first # worksheet, rows 1 through 4 and columns 1 through 3. my $Members = $Book->Worksheets(1); $Members->{Name} = "Members - Points"; my $Results = $Book->Worksheets(2); $Results->{Name} = "Perl Results -Saved"; my $Removals = $Book2->Worksheets(1); $Removals->{Name} = "Removals"; my $count=0; my %members_list; my @removals_list; my $MembersLastRow = &findLastRow($Members); print "After Members Last Row\n"; my $RemovalsLastRow = &findLastRow($Removals); print "After Removals Last Row\n"; foreach my $row (2..$MembersLastRow) { next unless defined $Members->Cells($row,1)->{'Value'}; $members_list{lc($Members->Cells($row,1)->{'Value'})} = lc($Members->Cells($row,2)->{'Value'}); } foreach my $row (2..$RemovalsLastRow) { next unless defined $Removals->Cells($row,1)->{'Value'}; push(@removals_list, lc($Removals->Cells($row,1)->{'Value'})); } #DO THE VLOOKUP my $matches=1; print "Now doing comparisons......\n"; $Results->Cells($matches,1)->{'Value'} = "Removal List"; $Results->Cells($matches,2)->{'Value'} = "Corresponding Member List"; foreach my $key (sort @removals_list) { print $key; if($members_list{$key}){ print " - MATCH!"; } print "\n"; } print "\nComparisons Complete.\n"; sub findLastRow { $_[0]->UsedRange->Find({What=>"*", SearchDirection=>xlPrevious, SearchOrder=>xlByRows})->{Row}; } sub findLastCol { $_[0]->UsedRange->Find({What=>"*", SearchDirection=>xlPrevious, SearchOrder=>xlByColumns})->{Column}; } $Book->Save(); 

如果您正在存储的值可能是undef,那么您需要这样做:

 if ( exists $members_list{$key} ) { 

你确定你正在访问相同的%members_list散列吗? 它没有超出范围,或者被my %members_list以后的my %members_list

这显示了什么:

 use Data::Dumper; $Data::Dumper::Terse = $Data::Dumper::Useqq = 1; print Data::Dumper::Dumper( { 'removals' => [ sort @removals_list ], 'members' => [ sort keys %members_list ] } );