Let's bloat it up with the ultra-cool Quantum::Superpositions. Performing a comparision using all( any( list1 ), any( list2 ) ) returns a quantum superposition of the two lists, as a wierd sort of scalar. Take that scalar's eigenstate and you end up with a bare unique list of characters found only in both lists.
use strict;
use warnings;
use Quantum::Superpositions;
my ($str1, $str2) = @ARGV;
die "Usage: $0 <string1> <string2>" if ! defined $str2;
print In_Common($str1, $str2), "\n";
sub In_Common {
my ($str1, $str2) = @_;
return join '',
eigenstates(
all(
any( split( //, $str1 ) ),
any( split( //, $str2 ) )
)
);
}
Of course this module is mostly a proof of concept, but it's a pretty cool concept.
By the way, I was just considering how one might modify the code to allow for any number of strings on the commandline. For example: ("abc", "bcd", "cde") would result in the output of "c". Or ("abcd", "bcde", "cdef", "defg") would output "d". I thought of a few strategies, but they all feel inelegant
Update: Ah, I got it. ...Here's a version of the preceeding script that allows for any number of strings on the command line:
use strict;
use warnings;
use Quantum::Superpositions;
print In_Common( @ARGV ), "\n";
sub In_Common {
return join '',
eigenstates(
all(
map { any( split( //, $_ ) ) } @_
)
);
}
With this script, ("abcd", "bcde", "cdef", "defg") would return "d".
|