首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法访问Perl循环中的哈希查找表

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

Stack Overflow用户
提问于 2011-05-18 02:44:20
回答 1查看 687关注 0票数 1

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

我目前正在获取其中一个excel文件的两列,并将其存储在散列中。我用来作为键的数据是电子邮件地址,而值只是excel表中的另一个值(不重要)。我只是尝试将所有的电子邮件存储为散列键,以便我可以遍历另一个(‘删除’) excel文件,并查看该电子邮件是否存在于原始的members表中。

我的意图大致如下:

1)创建hash和lookup数组:

代码语言:javascript
运行
复制
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)遍历查找数组,检查hash中是否存在:

代码语言:javascript
运行
复制
foreach my $key (sort @removals_list)
{
    print $key;
    if($members_list{$key}){
        print " - MATCH!";
    }
    print "\n";
}

问题是,当我尝试运行它时,从来没有任何匹配。删除列表中的所有元素都应该存储在members_list散列中。我试着把$members_list{$key}打印到屏幕上,然后它出现了一个"Uninitialized use of“诸如此类的东西。

我已经为此斗争了几天了,任何帮助都是非常感谢的。

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

代码语言:javascript
运行
复制
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();
EN

回答 1

Stack Overflow用户

发布于 2011-05-18 02:53:03

如果您要存储的值可能是undef,则需要执行以下操作:

代码语言:javascript
运行
复制
if ( exists $members_list{$key} ) {

您确定您正在访问相同的%members_list哈希吗?它没有超出范围,也没有被后来的my %members_list取代

这说明了什么:

代码语言:javascript
运行
复制
use Data::Dumper;
$Data::Dumper::Terse = $Data::Dumper::Useqq = 1;
print Data::Dumper::Dumper( { 'removals' => [ sort @removals_list ], 'members' => [ sort keys %members_list ] } );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6035588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档