#!/usr/bin/perl use strict; use warnings; use List::Util; # Read the lists of numbers my %lists; my $nameWidth = 5; my $maxNum = 0; # Implicit assumption that minimum value is 0 while () { next if ! /^([^=]+)\ =\s* {([^}]+)/x; my ($name, $list) = ($1, $2); my @values = split /\s*,\s*/, $list; $name =~ s/^\s+|\s+$//g; # Trim leading and trailing white space $lists{$name} = {map {$_ => 1} @values}; $nameWidth = length ($name) + 1 if $nameWidth <= length $name; $maxNum = List::Util::max ($maxNum, @values); } my @names = sort keys %lists; my $template = "-%4s " . ("%-${nameWidth}s" x @names) . "\n"; printf $template, '', @names; for my $row (0 .. $maxNum) { my @values; for my $name (@names) { my $list = $lists{$name}; push @values, exists $list->{$row} ? 'yes' : ''; } printf $template, $row, @values; } __DATA__ Array 1 = {0, 1,2,3,4,5,6,7,8,9} Array 2 = {1,2,3,4,6,8, 10, 12,14} Array 3 = {1,2,3,5,7,9, 11,13,15}