| String-Splitter documentation | Contained in the String-Splitter distribution. |
String::Splitter - Find all possible string splits and unique substrings.
Version 0.4
Find all possible string splits and unique substrings.
use String::Splitter;
my $ss = String::Splitter->new();
my $all_splits = $ss->all_splits("ABCD");
# $all_splits == [
# [ 'A', 'B', 'C', 'D' ],
# [ 'AB', 'C', 'D' ],
# [ 'A', 'B', 'CD' ],
# [ 'ABC', 'D' ],
# [ 'A', 'BC', 'D' ],
# [ 'AB', 'CD' ],
# [ 'A', 'BCD' ],
# [ 'ABCD' ]
# ]
my $all_substrings = $ss->all_substrings("ABCA");
# $all_substrings == [
# 'A',
# 'ABC',
# 'BC',
# 'ABCA',
# 'B',
# 'BCA',
# 'C',
# 'CA',
# 'AB'
# ];
Module is utf8 safe. You can
my $results = $ss->all_splits("☺☻");
to get
[
[ '☺', '☻' ],
[ '☺☻' ]
]
Amount of possible splits is equal to
2 ** ( length($string) -1)
so be careful with length as this grows REALLY fast!!
Creates new object.
my $results = $ss->all_splits("ABCD");
Returns ArrayRef of ArrayRefs with all possible splits.
Carp::confess will be called if param is missing or zero length.
my $results = $ss->unique_substrings("AABCDAA");
Returns ArrayRef of all possible unique substrings.
Carp::confess will be called if param is missing or zero length.
Pawel (bbkr) Pabian, <cpan at bbkr.org>
Private website: http://bbkr.org
Company website: http://implix.com
Please report any bugs or feature requests to bug-string-splitter at rt.cpan.org, or through
the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=String-Splitter. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
You can find documentation for this module with the perldoc command.
perldoc String::Splitter
You can also look for information at:
Copyright 2008 Pawel bbkr Pabian, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| String-Splitter documentation | Contained in the String-Splitter distribution. |
package String::Splitter; use Carp; use utf8; use warnings; use strict;
our $VERSION = '0.4';
sub new { my ($class) = @_; my $self = {}; return bless $self, $class; }
sub all_splits { my ( $self, $string ) = @_; confess 'Missing $string param' unless defined $string; confess 'Zero length $string param' unless length $string; $self->_generate_split_points( [], 0, length $string ); my @results; for my $pattern ( @{ $self->{'patterns'} } ) { my $s = $string; my @split; for my $amount ( @{$pattern} ) { push @split, substr $s, 0, $amount, ''; } push @results, \@split; } delete $self->{'patterns'}; return \@results; }
sub all_substrings { my ( $self, $string ) = @_; confess 'Missing $string param' unless defined $string; confess 'Zero length $string param' unless length $string; my %results; for my $i ( 0 .. length $string ) { for my $j ( 0 .. length $string ) { $results{ substr $string, $i, $j } = 1; } } delete $results{''}; return [ keys %results ]; } # generate all possible substring lengths # exmaple for 4 char string # # [ # [ 1, 1, 1, 1 ], # [ 2, 1, 1 ], # [ 1, 1, 2 ], # [ 3, 1 ], # [ 1, 2, 1 ], # [ 2, 2 ], # [ 1, 3 ], # [ 4, ] # ] # # saves them in $self->{'patterns'} sub _generate_split_points { my ( $self, $chunks, $length, $remaining ) = @_; if ( $length == $remaining ) { $chunks->[0] = $remaining; push @{ $self->{'patterns'} }, [ @{$chunks} ]; return; } for ( 1 .. $remaining ) { $self->_generate_split_points( [ @{$chunks}, $length ], $_, $remaining - $length ); } }
1; # End of String::Splitter