Text::Diff usage question
Text::Diff usage question
am 17.07.2006 15:15:49 von Ronald Fischer
I would like to compare two arrays of lines. If the arrays
are different, I want to output the differences in human-readable
form, and also call a function f().
I think that Text::Diff, found on CPAN, would useful. Indeed it
works, but my code looks a bit cumbersome and I wonder whether
one can make it easier:
# Compare the arrays
my @status_diff=Text::Diff::diff(\@after,\@before);
unless(@status_diff eq 0
|| (@status_diff eq 1 and length($status_diff[0]) eq 0))
{
# Lines differ
print(@status_diff); # print differences
f() # call f
}
What looks a bit complicated is the condition inside the "unless".
Even on identical arrays, diff returns an array of 1 string of
zero length. But I can't simplify it to, say
if(length($status_diff[0])) { print(...); f() }
because I could imagine that there are cases where diff
returns an empty list or even undef (I didn't find anything
in the diff documentation which guarantees that the output
is always an array of at least one string, when the default
formatter is used - or did I overlook something here in the
docs?).
Any suggestion how I could write this in a better way?
Ronald
--
Ronald Fischer
Posted via http://www.newsoffice.de/
Re: Text::Diff usage question
am 19.07.2006 06:01:11 von Jake Peavy
Ronald Fischer wrote:
> I would like to compare two arrays of lines. If the arrays
> are different, I want to output the differences in human-readable
> form, and also call a function f().
>
> I think that Text::Diff, found on CPAN, would useful. Indeed it
> works, but my code looks a bit cumbersome and I wonder whether
> one can make it easier:
>
> # Compare the arrays
> my @status_diff=Text::Diff::diff(\@after,\@before);
>
> unless(@status_diff eq 0
> || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> {
> # Lines differ
> print(@status_diff); # print differences
> f() # call f
> }
>
> What looks a bit complicated is the condition inside the "unless".
> Even on identical arrays, diff returns an array of 1 string of
> zero length. But I can't simplify it to, say
>
> if(length($status_diff[0])) { print(...); f() }
>
> because I could imagine that there are cases where diff
> returns an empty list or even undef (I didn't find anything
> in the diff documentation which guarantees that the output
> is always an array of at least one string, when the default
> formatter is used - or did I overlook something here in the
> docs?).
I don't know what docs you have, but mine say:
[Synopsis] my $diff = diff \@records1, \@records2;
and
[Output] If no OUTPUT is supplied, returns the diffs in a string
which leads me to believe your array will only ever have one element -
it just may or may not be defined.
-jp
Re: Text::Diff usage question
am 19.07.2006 10:13:36 von ro.naldfi.scher
DJ Stunks schrieb:
> > # Compare the arrays
> > my @status_diff=Text::Diff::diff(\@after,\@before);
> >
> > unless(@status_diff eq 0
> > || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> > {
> > # Lines differ
> > print(@status_diff); # print differences
> > f() # call f
> > }
> >
> > What looks a bit complicated is the condition inside the "unless".
> > Even on identical arrays, diff returns an array of 1 string of
> > zero length. But I can't simplify it to, say
> >
> > if(length($status_diff[0])) { print(...); f() }
> >
> > because I could imagine that there are cases where diff
> > returns an empty list or even undef (I didn't find anything
> > in the diff documentation which guarantees that the output
> > is always an array of at least one string, when the default
> > formatter is used - or did I overlook something here in the
> > docs?).
>
> I don't know what docs you have, but mine say:
>
> [Synopsis] my $diff = diff \@records1, \@records2;
> and
> [Output] If no OUTPUT is supplied, returns the diffs in a string
>
> which leads me to believe your array will only ever have one element -
> it just may or may not be defined.
I overlooked this. Thank you for pointing it out.
This makes the comparision a little bit simpler,
although it would be better IMO if the docs ensure exactly how
the result will look like when the arrays are equal (from the code
you can see that the output will be the string "" in such a case,
but this is not the same as documenting this fact - because if
it is documented, one can expect it to be part of the interface
and that it will stay the same in future versions of this module).
Ronald
Re: Text::Diff usage question
am 19.07.2006 21:25:50 von Jake Peavy
ro.naldfi.scher@gmail.com wrote:
> DJ Stunks schrieb:
> > > # Compare the arrays
> > > my @status_diff=Text::Diff::diff(\@after,\@before);
> > >
> > > unless(@status_diff eq 0
> > > || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> > > {
> > > # Lines differ
> > > print(@status_diff); # print differences
> > > f() # call f
> > > }
> > >
> > > What looks a bit complicated is the condition inside the "unless".
> > > Even on identical arrays, diff returns an array of 1 string of
> > > zero length. But I can't simplify it to, say
> > >
> > > if(length($status_diff[0])) { print(...); f() }
> > >
> > > because I could imagine that there are cases where diff
> > > returns an empty list or even undef (I didn't find anything
> > > in the diff documentation which guarantees that the output
> > > is always an array of at least one string, when the default
> > > formatter is used - or did I overlook something here in the
> > > docs?).
> >
> > I don't know what docs you have, but mine say:
> >
> > [Synopsis] my $diff = diff \@records1, \@records2;
> > and
> > [Output] If no OUTPUT is supplied, returns the diffs in a string
> >
> > which leads me to believe your array will only ever have one element -
> > it just may or may not be defined.
>
> I overlooked this. Thank you for pointing it out.
>
> This makes the comparision a little bit simpler,
> although it would be better IMO if the docs ensure exactly how
> the result will look like when the arrays are equal (from the code
> you can see that the output will be the string "" in such a case,
> but this is not the same as documenting this fact - because if
> it is documented, one can expect it to be part of the interface
> and that it will stay the same in future versions of this module).
the comparison is much simpler: if ( $diff ne q{} ) { #different...
I agree the module documentation should be updated to include the
return value of diff(). You should contact Barry and let him know.
-jp
>
> Ronald