匹配perl中2个数组的元素

时间:2010-05-31 17:41:50

标签: perl

现在我正在尝试同步按日期列出的两个数据文件,以便稍后进行比较。但是我似乎无法打印出日期匹配的行。此时我已将每个文件的数据分成2个数组。我只需找到两个数组中的日期并打印出来。任何建议都会非常感激。

以下是我正在使用的原始数据的示例集,每个文件的格式相同:

09/11/2009,00:56:00,51.602,47.894,87,88,0,1032
09/12/2009,00:56:00,57.794,55.796,93,54,0,1023.6
09/13/2009,00:56:00,64.292,62.204,93,66,0,1014.4
09/14/2009,00:56:00,61.592,55.4,80,25,0,1009.6
09/15/2009,00:56:00,58.604,53.798,84,31,0,1009.1
09/16/2009,00:56:00,53.6,48.902,84,45,0,1017

我已将日期拆分为每个文件的数组。我的最终目标是只打印两个文件都有数据的代码行。所以为了做到这一点,我想比较2个数组和元素是日期。

我的初始代码如下所示:

foreach $bdate(@bdate){
while (<PL>){
    chomp;
    @arr = split (/,/);
    $pday=$arr[1];
    push @pdate, $pday;
    if ($bdate eq $pdate){
        print "$bdate,$pday\n";
    }
}

3 个答案:

答案 0 :(得分:4)

一种方式(很多)将遍历每个数组,构建一个哈希,如下所示;

for (@array1, @array2) {
    $dates{$_}++;
}

然后您可以打印对应于2或更多值的键;

print $_,"\n" for grep {$dates{$_} > 1} keys %dates;

(未经测试,写在没有perl的机器上)

...快速CPAN搜索结果显示List::Compare,此示例为

$lc = List::Compare->new(\@Llist, \@Rlist);

@intersection = $lc->get_intersection;

答案 1 :(得分:1)

以下是perlfaq4的示例(简化了一点):

my (@intersection, %count);

for my $element (@array1, @array2) { $count{$element}++ }

for my $element (keys %count) {
    push @intersection, $element if $count{$element} > 1;        
}

更多惯用版:

my (%union, %isect);
for my $e (@array1, @array2) { $union{$e}++ && $isect{$e}++ }

my @intersection = keys %isect;

两种方法都假设每个元素在给定数组中都是唯一的。

答案 2 :(得分:0)

您是否反对使用外部Unix函数“comm”?