--- /dev/null
+#!/usr/bin/perl -w
+
+use strict;
+
+my %allergens;
+my %is_al;
+
+while (<>) {
+ chomp;
+ my ($ingr, $al) = /\A([^\(]+) \(contains (.*)\)\z/;
+ my %ingr = map { $_ => 1 } split /\s+/, $ingr;
+ my @al = split /, /, $al;
+ for my $al (@al) {
+ if (defined $allergens{$al}) {
+ for my $in1 (keys %{ $allergens{$al} }) {
+ if (! $ingr{$in1}) {
+ delete $allergens{$al}->{$in1};
+ }
+ }
+ } else {
+ $allergens{$al} = { %ingr };
+ }
+ }
+}
+
+AGAIN:
+for my $al (keys %allergens) {
+ if (keys %{ $allergens{$al} } == 1) {
+ my $in1;
+ for my $in (keys %{ $allergens{$al} }) {
+ $is_al{$in} = $al;
+ $in1 = $in;
+ }
+ delete $allergens{$al};
+ for my $al1 (keys %allergens) {
+ delete $allergens{$al1}->{$in1};
+ }
+ goto AGAIN;
+ }
+}
+
+print join(',', sort { $is_al{$a} cmp $is_al{$b} } keys %is_al), "\n";