my $given = $ARGV[0]; # ... while (<$dict_fh>) { chomp; print "$_\n" if is_subset($_, $given); } sub is_subset { my ($str1, $str2) = @_; my (%h1, %h2); $h1{$_}++ for split //, $str1; $h2{$_}++ for split //, $str2; for my $chr (keys %h2) { return if ! $h1{$chr} || $h2{$chr} > $h1{$chr}; } return 1; }