5 our @options, %candiates, @ballots;
7 my $candvoter_re = '\w+';
9 sub normalise_opts_list ($) {
11 foreach my $o (split /\s+/, $os) {
14 } elsif ($o =~ m/^\w+\=\S+$/) {
16 } elseif ($o !~ m/\S/) {
18 badinput "bad option \`$o'";
24 sub normalise_opts ($) {
26 my @o = normalise_opts_list $os;
36 push @options, normalise_opts_list $';
37 } elsif (m/^($candvoter_re?)\s*=\s*([^|]+?)\s*|(.*)?$/) {
38 my ($cand,$desc,$opts) = ($1,$2,$3);
39 push @{ $candidates{$cand}{Opts} }, normalise_opts $opts;
41 badinput "multiple descriptions for $cand" if
42 defined $candidates{$cand}{Desc};
43 $candidates{$cand}{Desc} = $desc;
45 $desc=$cand unless length $desc;
46 push @candidates, "$cand = $desc".
47 } elsif (m/^($candvoter_re?)?\s*\:([^|]+)(|(.*)?$/) {
48 my ($voter,$opts) = ($1,$3);
50 foreach my $p (split /\s+/, $2) {
51 if ($p =~ m/^\w+(?:\=\w+)*$/) {
53 $candidates{$_} //= { } foreach my $p =~ m/\w+/g;
55 badinput "bad vote preference \`$p'";
58 push @ballots, "$voter : @p".normalise_opts $opts;
61 badinput "unknown line format \`$_'";
65 print "| @options\n" or die $!;
67 foreach my $cand (sort keys %candidates) {
68 my $c = $candidates{$cand};
71 my $opts = $c->{Opts};
72 print "$cand = $c->{Desc} | @$opts\n" or die $!;
75 sub vsortkey { $_[0] =~ m/:/; return "$' : $`"; }
77 print $_,"\n" or die $! foreach
78 (sort { vsortkey($a) cmp vsortkey($b) } @ballots;
80 print ".\n" or die $!;