Home >Computer Tutorials >Computer Knowledge >Write a Perl program to calculate the intersection and difference of sets
use strict;
use utf8;
open fa, "a.txt" or die "can't open a";
open fb, "b.txt" or die "can't open b";
chomp ( my @A = ) ;
chomp ( my @B = ) ;
close a; close b;
my (@everyone, @AHasBNot, @BHasANot, %count);
$count{A}{$_}=1 foreach @A;
$count{B}{$_}=1 foreach @B;
In this code, by using a loop and a hash table, we can iterate over the list of keys and then increment the counter by the value of the given key. This code uses two hash tables (A and B) and iterates over their keys. Then, by using a counter (C) and a foreach statement in a loop, we can increment the counter value by the value of the given key.
@Everyone has it = grep { $count{C}{$_} == 2 } keys %{$count{C}}; means that the value in the hash table $count{C} is equal to 2 keys, filter them out and save them in the @everyone array. This statement is used to filter the hash table and only retain elements that meet the conditions.
foreach (@A, @B) { $count{A}{$_}; $count{B}{$_}; }
@A Yes B No This code uses the grep function and sort function of the Perl language to select elements that appear only once in the value corresponding to the A key from the hash array %count and sort them in alphabetical order. .
In this code, we use the `grep` function in the Perl language to filter out elements that appear once in array B but not in array A. The specific implementation is to loop through each element in the B array and use the hash table `%count` to record the number of occurrences of each element. Finally, we sort the B array and then use the `grep` function to filter out the elements that meet the conditions. Finally, we return the filtered results as an array.
print("Common: @Everyone has it$/A-Only: @Only A has it$/B-Only: @Only B has it");
$a=[
["sbnumber" => "0001-00001", "name" => "Xin'an Court"],
["sbnumber" => "0001-00002", "name" => "Zhongzhengyuan"],
["sbnumber" => "0001-00003", "name" => "Pragmatic Garden"]
["sbnumber" => "0001-00004", "name" => "Service Court"],
{ "sbnumber": "0001-00005", "name": "Zhang San" }
];
$b=[
["sbnumber" => "0001-00001", "name" => "Xin'an Court"],
["sbnumber" => "0001-00002", "name" => "Zhongzhengyuan"],
["sbnumber" => "0001-00003", "name" => "Pragmatic Garden"]
["sbnumber" => "0001-00004", "name" => "Service Court"],
{"sbnumber": "0001-00007", "name": "李思"}
];
$cmp=function($av, $bv){
$r is the result obtained by comparing $av['sbnumber'] and $bv['sbnumber'].
return $r===0 ? strcmp($av['name'],$bv['name']) : $r;
};
You can use the following code to get the values in array $a that are different from array $b and store them in array $c: $c = array_values(array_udiff($a, $b, $cmp));
$d=array_udiff($b, $a, $cmp);
foreach($d as &$dv) $c[]=$dv;
unset($d);
var_dump($c);array(2) {
[0]=> array(2) { ["sbnumber"]=> string(15) "0001-00005" ["name"]=> string(6) "Zhang San" }
[1]=> array(2) { ["sbnumber"]=> string(15) "0001-00007" ["name"]=> string(6) "李思" }
In order to compare two difference sets and merge the results, you need to use custom rules for comparing content. Based on different content (such as names), we can determine the differences between records and thus compare them.
The above is the detailed content of Write a Perl program to calculate the intersection and difference of sets. For more information, please follow other related articles on the PHP Chinese website!