1

読んでくれてありがとう。

ゴール:

  1. メールアドレスaa@gmail.com、bb@yahoo.comをある配列から別の配列にシフトしたいと思います。

  2. そのリストを利用したいときは毎回200の数で。

  3. これらの電子メールは、異なるドメイン名からのものでなければなりません。しかし、リストはすでにドメイン名でソートされています(MAPで実行されました)

  4. 簡単に言うと、配列をループして電子メールをフェッチする必要があるポインターに通知することであり、異なるドメイン名が見つかるたびに、最大200個の電子メールが送信されます。

それで、私は(これについての謝罪)壊れた擬似コードを思いついた。なぜなら、今日私がMAPについて読むのは初めてであり、このブロックは少し複雑であることがわかったからである。

方法:

  @destination_list =

map {$_->[0]}  # map back

for(my $i = 1; $i<201; ++$i) # this is to do the round of 200 emails per day
if($_ != $1 ) # compares 2 domains 

{


shift(@oldlist); # extract one from the old list and send it to the new list



}


map { m/@([a-zA-Z0-9\-.]*)\b/; [$_, $1]} # this gets what the domain name is
  @oldlist

ありがとうございました

4

2 に答える 2

3

メールアドレスが最も多いドメインから常に最初に選択することにより、グループの数を最小限に抑えます。

my %addrs_by_domain;
for my $addr (@addrs) {
   my $domain = ... extract domain of $addr ...;
   push @{ $addrs_by_domain{$domain} }, $addr;
}

while (%addrs_by_domain) {
   my @domains_by_freq =
      sort { @{ $addrs_by_domain{$b} } <=> @{ $addrs_by_domain{$a} }
       keys(%addrs_by_domain);

   splice @domains_by_freq, 200;

   my @group;
   for my $domain (@domains_by_freq) {
      push @group, shift( @{ $addrs_by_domain{$domain} } );
      delete( $addrs_by_domain{$domain} )
         if !@{ $addrs_by_domain{$domain} };
   }

   do_it(@group);
}
于 2012-07-01T18:13:38.903 に答える
1

これが私たちがチャットで思いついたものです。リスト全体を毎回処理し、1日に1つずつ、リストでいっぱいのarray-refを生成します。希望する日を指定することも、「x日後にこのドメインを再度使用しない」ブラックリストを提供することもできます。

use strict;
use warnings;
use feature 'say';
use Data::Dumper;

my $only_index = 3; # Read from command line with $ARGV[0] or use Getopt::Long

my %blacklist = (       # Each key in this hash represents one index/day
  '2' => [ 'a', 'b' ],  # and has an arrayref of domains that have replied on
  '3' => [ 'c' ],       # that day. We look at all keys smaller than the current
);                      # index in each iteration and ignore all these domains 

my @domains; # holds the domains we have already seen for each list
my @lists = ([]); # Holds all the lists
my %moved; # the addresses we moved to the back
my $i = 0;
my @addresses = <DATA>;

while (@addresses) {
  my $address = shift @addresses;
  chomp $address;
  $address =~ m/@([a-zA-Z0-9\-.]*)\b/;
  my $domain = $1;

  # If the domain has answered, do not do it again (finally, your map ;-))
  next if 
    grep { /$domain/ } 
    map { exists $blacklist{$_} ? @{ $blacklist{$_} } : () }  (0..$i);
  next if exists $moved{$address}; # THIS line was  missing
  $i++ if (@{ $lists[$i] } == 2 
           || (exists $moved{$address} && @addresses < 1));
  if (exists $domains[$i]->{$domain}) {
    push @addresses, $address;
    $moved{$address}++;
#     say "pushing $address to moved"; # debug
  } else {
    $domains[$i]->{$domain}++;
    # send the email
#     say "added $address to $i";      # debug
    push @{ $lists[$i] }, $address;
  }
}
# print Dumper \@lists;           # Show all lists
print Dumper $lists[$only_index]; # Only show the selected list
1;


__DATA__
1@a
2@a
3@a
1@b
2@b
1@c
2@c
3@c
1@d
2@d
3@d
4@d
1@e
1@f
1@g
1@h
4@a
5@a
4@c
于 2012-07-02T11:01:18.500 に答える