Array-Diff
view release on metacpan or search on metacpan
lib/Array/Diff.pm view on Meta::CPAN
package Array::Diff;
$Array::Diff::VERSION = '0.09';
use strict;
use warnings;
use base qw/Class::Accessor::Fast/;
use Algorithm::Diff 1.19;
eval q{ use Algorithm::Diff::XS; };
__PACKAGE__->mk_accessors(qw/added deleted count diff_class/);
=head1 NAME
Array::Diff - Find the differences between two arrays
=head1 SYNOPSIS
my @old = ( 'a', 'b', 'c' );
my @new = ( 'b', 'c', 'd' );
my $diff = Array::Diff->diff( \@old, \@new );
$diff->count # 2
$diff->added # [ 'd' ];
$diff->deleted # [ 'a' ];
=head1 DESCRIPTION
This module compares two B<pre-sorted> arrays
and returns the added or deleted elements in two separate arrays.
It's a simple wrapper around L<Algorithm::Diff>.
B<Note>: the arrays must be sorted before you call C<diff>.
And if you need more complex array tools, check L<Array::Compare>.
=head1 METHODS
=over 4
=item new ()
Create a new C<Array::Diff> object.
=cut
sub new {
my $self = shift->SUPER::new(@_);
$self->{diff_class} ||= $INC{'Algorithm/Diff/XS.pm'} ? 'Algorithm::Diff::XS' : 'Algorithm::Diff';
$self;
}
=item diff ( OLD, NEW )
Compute the differences between two arrays. The results are stored
in the C<added>, C<deleted>, and C<count> properties that may be
examined using the corresponding methods.
This method may be invoked as an object method, in which case it will
recalculate the differences and repopulate the C<count>, C<added>, and
C<removed> properties, or as a static method, in which case it will
return a newly-created C<Array::Diff> object with the properties
set appropriately.
=cut
sub diff {
my ( $self, $old, $new ) = @_;
$self = $self->new unless ref $self;
$self->added( [] );
$self->deleted( [] );
$self->count( 0 );
my $diff = $self->diff_class->new( $old, $new );
while ( $diff->Next ) {
next if $diff->Same;
my @deleted = $diff->Items(1);
my @added = $diff->Items(2);
$self->{count} += @added + @deleted;
push @{$self->{deleted}}, @deleted if @deleted;
push @{$self->{added}}, @added if @added;
}
$self;
}
=item added ( [VALUES ] )
Get or set the elements present in the C<NEW> array and absent in
the C<OLD> one at the comparison performed by the last C<diff()>
invocation.
=item deleted ( [VALUES] )
Get or set the elements present in the C<OLD> array and absent in
the C<NEW> one at the comparison performed by the last C<diff()>
invocation.
=item count ( [VALUE] )
Get or set the total number of added or deleted elements at
the comparison performed by the last C<diff()> invocation.
This count should be equal to the sum of the number of elements in
( run in 0.597 second using v1.01-cache-2.11-cpan-39bf76dae61 )