#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11109069 # clique use warnings; use List::Util qw( uniq ); my $edges = < '(*FAIL)' ), $edges =~ /\w+,\w+/g; my %cliques; my %seen; find( uniq sort $edges =~ /\w+/g ); # start with every node sub find { $seen{ my $set = "@_" }++ and return; if( my @out = $set =~ /\b(\w+)\b.+\b(\w+)\b(??{ $edges{"$1,$2"} || "" })/ ) { for my $node ( @out ) # pair of unconnected nodes, try without each one { @_ > 3 and find( grep $_ ne $node, @_ ); } } else { $cliques{ $set }++; # it is fully connected } } my $uniquecliques = ''; for ( sort { length $b <=> length $a } sort +uniq keys %cliques, map tr/,/ /r, keys %edges ) { my $pattern = " $_ " =~ s/\w+/\\b$&\\b/gr =~ s/ /.*?/gr; $uniquecliques =~ /^$pattern$/m or $uniquecliques .= "$_\n"; } print $uniquecliques;