note
japhy
Using liverpole's hash idea, I've come up with this (updated with comments):
<code>
use strict;
use warnings;
my (%pos, @order);
# collect the position information
{
local $/ = "";
while (<DATA>) {
chomp;
my $i = 0;
# $pos{TERM}{SET #} = POSITION
$pos{$_}{$. - 1} = $i++ for split /\n/;
}
}
# extract order from the positions
for my $i (1 .. keys %pos) {
# get all terms who appear ONLY in position 0
# across all the sets they're in
my ($first, @extra) = grep {
my $t = $_;
my %p = map { $_ => 1 } values %{ $pos{$t} };
$p{0} and keys(%p) == 1
} keys %pos;
# if there was more than one term found, cause a fuss
warn "iteration #$i: multiple candidates [$first @extra]\n" if @extra;
# uncomment for debugging to see how %pos changes
# use Data::Dumper; print Dumper(\%pos);
# get the sets this term appeared in and alter
# the positions of terms found in those sets
for my $set (keys %{ delete $pos{$first} }) {
$pos{$_}{$set} and $pos{$_}{$set}-- for keys %pos;
}
# store this term in the ordered list
push @order, $first;
}
print "<@order>\n";
__DATA__
alpha
beta
epsilon
zeta
beta
gamma
zeta
alpha
gamma
delta
epsilon
</code>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-1936">
<hr/>
Jeff <tt><font color="#0000ff">[japhy]</font></tt> Pinyan,
[id://371157|P.L., P.M., P.O.D, X.S.]:
<a href="http://japhy.perlmonk.org/modules/">Perl</a>,
<a href="http://japhy.perlmonk.org/modules/Regexp-Parser/">regex</a>,
and <a href="http://lists.perl.org/showlist.cgi?name=perl5-porters"><tt>perl</tt></a>
<a href="http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?query=hacker">hacker</a>
<br>
<i>How can we ever be the sold short or the cheated, we who for every service have long ago been overpaid? ~~ <b>Meister Eckhart</b></i>
</div></div>
563819
563819